使用 swift 添加 NSNotification Observer
Adding NSNotification Observer using swift
我使用的是 this example,它解释了 NSNotification
的用法。
在我的例子中,我有一个 UIViewController
,其中我有一个 UITableView
。我通过实例化我的 UITableViewController
以编程方式为该表视图分配 dataSource
和 delegate
。到目前为止,我还没有声明任何初始化,因此一直使用简单的 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)
}
}
如果我尝试在 UIViewController
的 viewDidLoad()
中添加观察者,它不起作用。
所以我的问题是:使用 NSNotification
是否需要使用 init(coder aDecoder: NSCoder)
?如果是这样,那么在 swift 中使用此 init 进行初始化的正确方法是什么?我应该如何在我的 UIViewController
实例 foo 中实例化 MyTableViewController?
viewDidLoad
仅在加载视图控制器的视图时调用 - 在您显示的代码中创建一个 table 视图控制器子类,将其分配为数据源和委托另一个 table 视图(令人困惑,因为它已经是它自己的 table 视图的数据源和委托),但实际上从未对 table 视图控制器的视图做任何事情。
这意味着viewDidLoad
不会被调用。
您可能应该将 table 视图控制器的 tableView
添加为子视图,并将其添加为子视图控制器,以便正确转发旋转和外观事件。
请注意,问题和答案与通知中心或 Swift 无关,只是了解视图控制器生命周期。
如果您想要一个单独的对象充当 table 视图的数据源和委托,这是个好主意,但不要使用 UITableViewController 子类。只需创建一个符合数据源 and/or 委托协议的普通对象。
我使用的是 this example,它解释了 NSNotification
的用法。
在我的例子中,我有一个 UIViewController
,其中我有一个 UITableView
。我通过实例化我的 UITableViewController
以编程方式为该表视图分配 dataSource
和 delegate
。到目前为止,我还没有声明任何初始化,因此一直使用简单的 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)
}
}
如果我尝试在 UIViewController
的 viewDidLoad()
中添加观察者,它不起作用。
所以我的问题是:使用 NSNotification
是否需要使用 init(coder aDecoder: NSCoder)
?如果是这样,那么在 swift 中使用此 init 进行初始化的正确方法是什么?我应该如何在我的 UIViewController
实例 foo 中实例化 MyTableViewController?
viewDidLoad
仅在加载视图控制器的视图时调用 - 在您显示的代码中创建一个 table 视图控制器子类,将其分配为数据源和委托另一个 table 视图(令人困惑,因为它已经是它自己的 table 视图的数据源和委托),但实际上从未对 table 视图控制器的视图做任何事情。
这意味着viewDidLoad
不会被调用。
您可能应该将 table 视图控制器的 tableView
添加为子视图,并将其添加为子视图控制器,以便正确转发旋转和外观事件。
请注意,问题和答案与通知中心或 Swift 无关,只是了解视图控制器生命周期。
如果您想要一个单独的对象充当 table 视图的数据源和委托,这是个好主意,但不要使用 UITableViewController 子类。只需创建一个符合数据源 and/or 委托协议的普通对象。