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状态,则可以正确设置委托。