使用 swift 添加 NSNotification Observer

Adding NSNotification Observer using swift

我使用的是 this example,它解释了 NSNotification 的用法。

在我的例子中,我有一个 UIViewController,其中我有一个 UITableView。我通过实例化我的 UITableViewController 以编程方式为该表视图分配 dataSourcedelegate。到目前为止,我还没有声明任何初始化,因此一直使用简单的 init() 来初始化我的 UITableViewController。 (这个 UITableViewController 在故事板上 不是

class foo: UIViewController{
      @IBOutlet weak var fooTable: UITableView!
      var fooTableViewController = MyTableViewController()

      override func viewDidLoad(){
             super.viewDidLoad()
             fooTable.delegate = fooTableViewController
             fooTable.dataSource = fooTableViewController
      }
}

class MyTableViewController: UITableViewController {
     override func viewDidLoad(){
           super.viewDidLoad()
           NSNotificationCenter.defaultCenter().addObserver(self, selector: "notificationReceived", name: "TEST_NOTIFICATION", object: nil)
     }
}

如果我尝试在 UIViewControllerviewDidLoad() 中添加观察者,它不起作用。

所以我的问题是:使用 NSNotification 是否需要使用 init(coder aDecoder: NSCoder)?如果是这样,那么在 swift 中使用此 init 进行初始化的正确方法是什么?我应该如何在我的 UIViewController 实例 foo 中实例化 MyTableViewController?

viewDidLoad 仅在加载视图控制器的视图时调用 - 在您显示的代码中创建一个 table 视图控制器子类,将其分配为数据源和委托另一个 table 视图(令人困惑,因为它已经是它自己的 table 视图的数据源和委托),但实际上从未对 table 视图控制器的视图做任何事情。

这意味着viewDidLoad不会被调用。

您可能应该将 table 视图控制器的 tableView 添加为子视图,并将其添加为子视图控制器,以便正确转发旋转和外观事件。

请注意,问题和答案与通知中心或 Swift 无关,只是了解视图控制器生命周期。

如果您想要一个单独的对象充当 table 视图的数据源和委托,这是个好主意,但不要使用 UITableViewController 子类。只需创建一个符合数据源 and/or 委托协议的普通对象。