在没有segue

时间:2016-01-04 20:05:53

标签: ios iphone swift delegates

我读了几篇关于在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
    }

}

我应该如何在这里设置接收代表?

2 个答案:

答案 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可能已加载,也可能未加载。