Swift:通过NSNotificationCenter从子ViewController返回数据

Aap*_*ike 3 notifications viewcontroller swift

我有一个带有排序按钮的表视图控制器,我用它来允许用户更改tableview的排序顺序.按下按钮时,我会转到排序视图控制器,并传入当前排序顺序,UIPickerView将其选中并设置为所选项目.

如果用户更改了选择器中的选定项,我想将其发送回父视图控制器,以便它可以重新排序表.

到目前为止,我已经看到了两种方法:设置委托或使用NSNotificationCenter.我决定试试后者.

在我的SortViewController中,我捕获任何更改pickerView:didSelectRow:InComponent,然后将新值作为命名通知发布.

在父视图控制器中,我在视图控制器的init中添加了一个addObserver调用,以便它正在侦听该通知,但显然从未发送通知.

这是代码:

TableViewController:

var sortOrder: String = "Name"

NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: "setSortOrder:",
    name: "sortOrderChangedNotification",
    object: sortOrder )
Run Code Online (Sandbox Code Playgroud)

接收功能:

func setSortOrder( notification: NSNotification ) {
    // set the sort order
    println("Received sortOrderChangedNotification")
}
Run Code Online (Sandbox Code Playgroud)

SortViewController:

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) {
    println("Picker view selection changed!")
    var selRow = sortPickerView.selectedRowInComponent(0)
    NSNotificationCenter.defaultCenter().postNotificationName("sortOrderChangedNotification", object: sortMethods[selRow] )
}
Run Code Online (Sandbox Code Playgroud)

我从来没有得到setSortOrder的println输出,据我所知,这可能意味着a)通知没有被推送(即使didSelectRow中的println打印)b)我的观察者没有收到它或c )我的观察者设置错了.

任何输入将不胜感激.

Ima*_*tit 9

你的-addObserver:声明必须是这样的:

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "setSortOrder:", name: "sortOrderChangedNotification", object: nil)    
}
Run Code Online (Sandbox Code Playgroud)

你的-postNotificationName声明必须是这样的:

NSNotificationCenter.defaultCenter().postNotificationName("sortOrderChangedNotification", object: nil, userInfo: ["row": sortMethods[selRow]]) //userInfo parameter has to be of type [NSObject : AnyObject]?
Run Code Online (Sandbox Code Playgroud)

然后,您可以-setSortOrder:使用notification.userInfo以下方法完成方法:

func setSortOrder(notification: NSNotification) {
    //deal with notification.userInfo
    println(notification.userInfo)

    println("Received sortOrderChangedNotification")
}
Run Code Online (Sandbox Code Playgroud)

停止观察:

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}
Run Code Online (Sandbox Code Playgroud)