Ios 视图未在闭包表达式内更改

Ios 视图未在闭包表达式内更改,ios,swift,Ios,Swift,我有以下代码: @IBAction func createUser(sender: AnyObject, forEvent event: UIEvent) { userManager!.createUser( username.text, { println( "new user created" ) self.navigationController.popToRootViewControllerAnimated( true ) self


我有以下代码:

@IBAction func createUser(sender: AnyObject, forEvent event: UIEvent) {
    userManager!.createUser( username.text, {
        println( "new user created" )
        self.navigationController.popToRootViewControllerAnimated( true )
        self.callback!()
    })


}
但调用此函数时,中的视图控制器不会更改

如果我将PoptorootViewController设置在内部闭包表达式之外,即:

@IBAction func createUser(sender: AnyObject, forEvent event: UIEvent) {
    userManager!.createUser( username.text, {
        println( "new user created" )

        self.callback!()
    })

    self.navigationController.popToRootViewControllerAnimated( true )
}
视图将被更改,所有操作都将正常进行

知道为什么吗

更新: 我只是想说清楚。。我确实从createUser方法调用了这个表达式,println是“newusercreated”。
只是视图没有改变…

除非
createUser
方法调用
closure
,否则它不会调用。Clousre不会立即调用。在
createUser
方法中,我们只是传递闭包。调用闭包是
createUser
的责任。您需要在这是什么样的结局

createUser(userName:String,parameterNameWhichTakesClousre: () -> ()){

...  //other instructions
parameterNameWhichTakesClousre() //put this in `createUser` to call closure.
}

如果将
self.navigationController.popToRootViewControllerAnimated(true)
在clousre外部,它将立即被调用,因为它在函数中,它将立即在您放置的位置调用。

它将不会调用,直到并且除非
createUser
方法调用
Close
。clousre不会立即被调用。在
createUser
方法中,我们只是传递闭包。它的责任是
createUser
调用闭包。您需要调用clousre by参数,闭包在该参数中采用如下方式

createUser(userName:String,parameterNameWhichTakesClousre: () -> ()){

...  //other instructions
parameterNameWhichTakesClousre() //put this in `createUser` to call closure.
}

如果您将self.navigationController.popToRootViewControllerAnimated(true)放在clousre外部,它将立即被调用,就像它在函数中一样,并且它将立即调用您放置的位置。

您必须仅在主线程上更改UI。由于
popToRootViewControllerAnimated(…)
更改了应在主线程上调用的UI,您可以将其包装在GCD调用中:

dispatch_async(dispatch_get_main_queue()) {
    if let nc = self.navigationController {
        nc.popToRootViewControllerAnimated(true)
    }
}

您必须仅在主线程上更改UI。由于
popToRootViewControllerAnimated(…)
更改了应在主线程上调用的UI,您可以将其包装在GCD调用中:

dispatch_async(dispatch_get_main_queue()) {
    if let nc = self.navigationController {
        nc.popToRootViewControllerAnimated(true)
    }
}

是的,我知道这一切。我从createUser调用这个clousre,那里的打印也被打印出来了。。只是景色没有改变。。尝试将
navigationController
引用放入变量中,然后在
clousre
中使用,不确定这是否有效。是的,我知道所有这些。我从createUser调用这个clousre,那里的打印也被打印出来了。。只是景色没有改变。。尝试将
navigationController
引用放入变量中,然后在
clousre
中使用,但不确定此操作是否有效。