从其他视图控制器访问IBOutlet



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

编辑

第一视图控制器

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
            }
        }
    }
}

第二视图控制器

@IBOutlet weak var billLabel: UILabel!
var billString = "test"
override func viewDidLoad() {
    super.viewDidLoad()
    billLabel.text = billString
}

你可以实现 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 起你想要的名字,把它放在它说你的 SegueID 的地方,当你执行 segue 时,目标 vc 中的 var 将具有你发送的值。

我在电话里,所以我不能 100% 确定这段代码是否有效,但如果你有问题,你可以问。

这是我能够在操场上超快地敲定的实现。这个想法是创建一个协议和子类 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">

您可以使用情节提要ID或某种跟踪ViewController的方法将其调整为UIViewController实现,并且假设您知道UIViewController的nil状态,则可以正确设置委托。

最新更新