从其他View Controller访问IBOutlet

时间:2017-02-08 19:16:19

标签: swift uiviewcontroller xcode8 iboutlet

Stack Overflow上有许多问题,但似乎没有一个问题只是回答我的具体问题。我希望能够在一个视图控制器上创建一个标签,该标签可以根据另一个视图控制器上的标签值更改显示的内容。我正在使用Xcode 8.2.1和Swift 3。

修改

FirstViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showSecondViewController" {

        if let viewController = segue.destination as? SecondViewController {

            if messageLabel != nil {

                SecondViewController.billString = self.messageLabel //error on this line

            }
        }
    }
}

SecondViewController

@IBOutlet weak var billLabel: UILabel!

var billString = "test"

override func viewDidLoad() {
    super.viewDidLoad()

    billLabel.text = billString

}

2 个答案:

答案 0 :(得分:0)

这是我能够在Playground上超级快速实现的实现。这个想法是你创建一个协议和子类UILabel并用一个调用协议方法的didSet覆盖它的text属性。

class Label:UILabel {
    var delegate:LabelDelegate?

    override var text: String? {
        didSet {
            if let text = text {
                self.delegate?.valueChanged(string: text)
            }
        }
    }
}

protocol delegate:LabelDelegate {
    func valueChanged(string:String)
}

class ViewControllerA:UIViewController {
    IBOutlet weak var label:Label!
}

class ViewControllerB:UIViewController, LabelDelegate {
    IBOutlet weak var label:UILabel!

    func viewDidLoad() {
        let a = A() // This is where you whould get a reference to ViewControllerA. Maybe using storyboardID or some other way
        a.label.delegate = self
    }

    internal func valueChanged(string: String) {
        //Check what the string variable is and set your label accordingly
        self.label.text = "Hello World"
    }
}

b.label现在包含“Hello World”文本

你可以使用storyboardIDs或者某种方式来跟踪ViewControllers并假设你知道你的UIViewController的nil状态,将它改编为UIViewController实现,你可以正确设置委托。

答案 1 :(得分:0)

您可以实现prepareForSegue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "yourSegueIDHere" {
            if let viewController = segue.destination as? DestinationViewController {
              if(theVarContainingTheStringYouWantToSend !=nil){
                DestinationViewController.newVarContainigString = self.theVarContainingTheStringYouWantToSend 
               }
            }
        }
    }

您在DestinationViewController中创建newVarContainigString,并为segue指定您想要的名称,并将其放在它所说的yourSegueIDHere的位置,当您执行segue时,目标vc中的var将具有您发送的值。

我正在打电话,所以如果此代码有效,我无法100%确定,但如果您遇到问题,可以提问。