我是编程和新手的新手。 Swift和我试图了解如何在两个视图控制器(没有segue)之间传递数据与协议和委托。
我有一个视图控制器(视图A),它有一个文本字段和按钮。当用户点击该按钮时,它应该在另一个视图控制器(视图B)的标签中显示该文本。
我无法获得标签来显示文字 - 我希望能够解释这项工作需要什么。
非常感谢!
import UIKit
protocol sendNameToViewB {
func showNameLabel(name:String)
}
class ViewA: UIViewController {
var delegate: sendNameToViewB?
@IBOutlet weak var textField: UITextField!
@IBAction func addButton(sender: AnyObject) {
delegate?.showNameLabel(textField.text)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
class ViewB: UIViewController, sendNameToViewB {
@IBOutlet weak var theLabel: UILabel!
func showNameLabel(name: String) {
theLabel.text = name
}
}
答案 0 :(得分:8)
首先,注意:您的视图控制器名称应包含" ViewController"在名字里。从UIView
继承的类集合完全不同。仅ViewA
命名视图控制器使您的类看起来只是一个视图而不是视图控制器。视图位于应用程序的完全不同的层中。
现在,要将数据传递给另一个对象,您的第一个要求是在它们之间有一个引用。可以在任一方向设置此参考。
一种可能性是让ViewControllerA保持对ViewControllerB的引用。通过此引用,ViewControllerA可以在按下按钮时调用ViewControllerB上的方法,该方法将您想要传递的数据作为参数传递。
class ViewControllerA: UIViewController {
@IBOutlet weak var viewControllerB: ViewControllerB!
@IBAction func addButton(sender: AnyObject) {
self.viewControllerB.showNameLabel(textField.text)
}
}
另一种可能性是使用像标题所暗示的委托模式。这将涉及ViewControllerB具有对ViewControllerA的引用。优选地,这不是直接了解ViewControllerA类,而是通过协议。该协议将定义一种方法,返回您想要的数据"传递"到ViewControllerB。这样,ViewContollerB可以在其#34;委托"上调用协议方法。 (它恰好是ViewControllerA)来获取它需要的数据。
protocol ViewControllerBDelegate {
func requiredText() -> String
}
class ViewControllerB: UIViewController {
@IBOutlet weak var delegate: ViewControllerBDelegate?
override func viewDidLoad() {
if let actualDelegate = self.delegate {
self.theLabel.text = actualDelegate.requiredText()
}
}
}
您选择哪种方法实际上取决于您在这种情况下的需求。委托模式更好地保持您的对象不那么耦合在一起,但如果您已经需要"触发"从ViewControllerA在ViewControllerB上发生的事情可能需要更直接的方法。