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
}
答案 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%确定,但如果您遇到问题,可以提问。