我正在IOS/swift中创建一个库,它是:
takes a user to a scene
->performs a task
->return to the initial scene that called the first while passing a payload back to the user
我已经想好了如何将用户带回调用它的前一个场景,但我的问题是如何使用下面的代码片段将有效载荷发送回:
func switchToPreviousPage(){
self.dismiss(animated: true, completion: nil)
}
我该如何做到这一点?
在您的场景中,您可以使用以下任意一种:
- 委派模式
- 通知/观察员
让我们讨论每一个:
1.委托:
如果你对Swift中的Protocol有想法,你可以很容易地做到。首先创建一个具有您想要实现的所需功能的协议:
protocol FirstControllerDelegate: AnyObject {
func sendData(data: String)
}
假设你的第一个页面是FirstViewController,它有一个UILabel,我们必须从我们的第二个页面中为它分配一个String,意思是SecondViewController。FirstViewController的结构可能是这样的:
class FirstViewController: UIViewController {
@IBOutlet weak var textLabel: UILabel!
@IBAction func gotoSecondPage() {
let secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
}
}
现在,您的FirstViewController必须确认该协议,它将实现sendData(data:(方法:
extension FirstViewController: FirstControllerDelegate {
func sendData(data: String) {
textLabel.text = data
}
}
现在,作为iOS中协议的一个功能,协议可以作为一种类型(如Int、String(工作。因此,只需在SecondViewController中创建一个类型为FirstControllerDelegate的变量即可!
class SecondViewController: UIViewController {
weak var delegate: FirstControllerDelegate!
@IBAction func switchToPreviousPage() {
delegate.sendData(data: "Hello")
self.dismiss(animated: true, completion: nil)
}
}
现在,您可以使用上面创建的变量调用sendData(data:(函数!
最后你必须做一件事,只需分配代表:
secondVC.delegate = self
它应该在gotoSecondPage((方法内部!
2.通知/观察员
有了这个,我们的基本想法是在我们的应用程序中发送一个通知,它可以被里面的任何地方观察到!
因此,我们的SecondViewController将发送一个嵌入了我们想要传递的所需数据的通知,FirstViewController将收到通知,并从通知中提取数据!!
每个通知都有一个特定的名称,这将使其与其他通知不同。我们必须创建名称:
Notification.Name(rawValue: "com.app.notificationObserver")
现在FirstViewController将观察这个特定的通知:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.changeLabelText(notifcation:)), name: Notification.Name("com.app.notificationObserver"), object: nil)
}
我们必须定义changeLabelText(通知:(方法:
private func changeLabelTExt(notification: NSNotification) {
if let dataDict = notification.userInfo as NSDictionary? {
if let message = dataDict["data"] as? String {
self.textLabel.text = message
}
}
}
最后,SecondViewController将触发Notification:
@IBAction func switchToPreviousPage() {
NotificationCenter.default.post(name: Notification.Name(rawValue: "com.app.notificationObserver"), object: ["data": "hello"])
self.dismiss(animated: true, completion: nil)
}
仅此而已。。。。。