我读了几篇关于在Swift中使用代理的帖子,但大多数时候他们建议调用viewcontroller来接收带有segue的委托。我想知道如何在没有segue的情况下这样做,例如在TabBar应用程序中。这是FirstViewController.swift的代码
// FirstViewController.swift
import UIKit
protocol FirstViewControllerDelegate {
func didSendMessage(message: String)
}
class FirstViewController: UIViewController {
var delegate: FirstViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
delegate?.didSendMessage("Hello from FirstViewController")
}
}
这里是SecondViewController.swift
// SecondViewController.swift
import UIKit
class SecondViewController: UIViewController, FirstViewControllerDelegate {
@IBOutlet weak var secondSubTitleLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// how to set delegate here?
}
func didSendMessage(message: String) {
secondSubTitleLabel.text = message
}
}
我应该如何在这里设置接收代表?
答案 0 :(得分:3)
这通常不是代表符合您要实现的目标的情况。如果你只是想从FirstViewController调用SecondViewController中的某个方法,你可以通过
获得引用if let vc = self.tabBarController!.viewControllers[1] as? SecondViewController {
vc.didSendMessage("hello")
}
或者您可能希望发送NSNotification以避免上述代码引入的紧密耦合
在AppDelegate中:
NSNotificationCenter.defaultCenter().postNotification("ReceivedAppWatchData", object: self, userInfo: theData)
在您想要接收数据的任何视图控制器中:
func viewDidLoad() {
...
// subscribe to notification
NSNotificationCenter.defaultCenter().addObserver(self, selector: "watchDataReceived:", name: "ReceivedAppWatchData",object: nil)
...
}
func watchDataReceived(notif: NSNotification) {
// handle data
}
deinit {
// unsubscribe to notifications
NSNotification.defaultCenter().removeObserver(self)
}
这样任何视图控制器都可以在不知道彼此的情况下访问数据。
答案 1 :(得分:0)
您的标签栏控制器正在控制每个标签的视图控制器,因此您应该在标签栏控制器中设置委托。
False
此代码显然存在一些类型安全问题,并假设class TabBarController: UITabBarController {
func viewDidLoad() {
super.viewDidLoad()
let firstVC = viewControllers[0] as! FirstViewController
let secondVC = viewControllers[1] as! SecondViewController
firstVC.delegate = secondVC
}
}
和viewControllers[0]
分别为viewControllers[1]
和FirstViewController
。此外,您应该等到在此示例中SecondViewController
之后调用委托方法。 viewDidLoad
可能已加载,也可能未加载。