代码之家  ›  专栏  ›  技术社区  ›  frankwolffnl

如何从另一个属性访问主视图控制器中的属性(使用didset observer)?[副本]

  •  0
  • frankwolffnl  · 技术社区  · 6 年前

    我尝试在加载视图时创建全局变量并更新信息,但没有呈现数据。

    全局变量

    var viewName:String = ""
    var viewDuration:String = ""
    var viewPeriod:String = ""
    var viewMinAmp:String = ""
    var viewMaxAmp:String = ""
    var viewStep:String = ""
    var viewType:String = ""
    

    有没有比使用全局变量更有效地传递信息的方法?

    @IBOutlet var txtName: UITextField!
    @IBOutlet var txtDuration: UITextField!
    @IBOutlet var txtPeriod: UITextField!
    @IBOutlet var txtMinAmp: UITextField!
    @IBOutlet var txtMaxAmp: UITextField!
    @IBOutlet var txtStep: UITextField!
    @IBOutlet var txtType: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        setInfo(viewName, duration: viewDuration, period: viewPeriod, minAmp: viewMinAmp, maxAmp: viewMaxAmp, step: viewStep, type: viewType)
    }
    
    func setInfo(name: String, duration: String, period: String, minAmp: String, maxAmp: String, step: String, type: String) {
        txtName.text = name
        txtDuration.text = duration
        txtPeriod.text = period
        txtMinAmp.text = minAmp
        txtMaxAmp.text = maxAmp
        txtStep.text = step
        txtType.text = type
    }
    
    0 回复  |  直到 8 年前
        1
  •  34
  •   Scott Mielcarski    8 年前

    一种解决方案是在视图控制器中覆盖PrepareForSegue(segue:sender:),该视图控制器包含要传递到目标视图控制器的数据。

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
        if (segue.identifier == "YourSegueName") {
            //get a reference to the destination view controller
            let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass
    
            //set properties on the destination view controller
            destinationVC.name = viewName
            //etc...
        }
    }
    
        2
  •  23
  •   Saqib Omer Dasoga    7 年前

    对于Swift 3.0

    final class Shared {
         static let shared = Shared() //lazy init, and it only runs once
    
         var stringValue : String!
         var boolValue   : Bool!
    }
    

    设置 stringValue

    Shared.shared.stringValue = "Hi there"
    

    得到 字符串值

     if let value = Shared.shared.stringValue {
            print(value)
     }
    

    对于低于3.0的Swift版本

    您可以使用singleton类在视图之间传递数据。这是一种简单而有效的方法。这是我的班级sharedata.swift

    import Foundation
    
    class ShareData {
        class var sharedInstance: ShareData {
            struct Static {
                static var instance: ShareData?
                static var token: dispatch_once_t = 0
            }
    
            dispatch_once(&Static.token) {
                Static.instance = ShareData()
            }
    
            return Static.instance!
        }
    
    
        var someString : String! //Some String
    
        var selectedTheme : AnyObject! //Some Object
    
        var someBoolValue : Bool!
    }
    

    现在在我的 ViewControllerOne 我可以设置上面的变量。

    //Declare Class Variable
    
    let shareData = ShareData.sharedInstance
    
    override func viewDidLoad() {
        self.shareData.someString ="Some String Value"
    }
    

    在我的 ViewControllerTwo 我可以进入 someString 作为

    let shareData = ShareData.sharedInstance
    override func viewDidLoad() {
        NSLog(self.sharedData.someString) // It will print Some String Value
    }
    
        3
  •  4
  •   Ke Yang    9 年前

    就我个人而言,我更喜欢以下方式:

    • 如果你想在两个视图控制器之间向前跳(从A到B),如-pushviewcontroller:animated:在导航中,你可以为控制器B定义一个模型的属性并公开它,然后在从控制器A跳出来之前显式设置这个属性,这很简单;

    • 如果要从控制器B向后跳到A,请使用委托+协议模式。控制器B起草公共协议并拥有“委托”财产,任何想成为控制器B委托人的对象都应遵守并执行其协议(可选)。然后,在向后跳之前,控制器B让其委托执行协议中列出的某些操作,这样就可以传输数据;

    • 在某些情况下,您可能希望将数据从控制器(或控制器)传输到其他多个控制器,如果是这种情况,请使用通知机制。

    苹果在官方文档中有关于委托模式、通知模式的详细说明,请在xcode中查看它们,:)

        4
  •  1
  •   Community Egal    7 年前

    只需遵循3个步骤,假设您希望将数据从ViewControllerA传递到ViewControllerB:

    1. 在ViewControllerA和ViewControllerB之间创建一个段
    2. 在Segue的属性检查器中用标识符命名它
    3. 覆盖 prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) 在视图控制器A

    对于步骤3, :

    • 如果你是 不使用Swift 2.1 ,请跟我来 @Scott Mielcarski 's answer at this question
    • 对于正在使用的人 银行代码:2.1 或者谁得到 错误 “无法将类型”uiviewcontroller“的值转换为指定类型”your view controller class name“,后面是” @斯科特·米尔卡斯基对这个问题的回答 , 请使用 : let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass 而不是 let destinationVC:ViewControllerClass = segue.destinationViewController

      这是在Swift2.1.1上测试的,它适用于我。