我已经创建了一个从按钮到 View Controller 本身的自转,即,当单击按钮时, View 将转到自身。
我在 View Controller 中声明了一个 Bool
变量 isSearch
:
var isSearch! false
现在,当单击按钮时,prepareForSegue
会输出 isSearch
值,即 false
,这是正确的:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SearchSelfSegue" {
if let destVC = segue.destinationViewController as? SearchVC {
print("SearchSelfSegue:\(isSearch)")// output: false
}
}
}
我在 View Controller 上面定义了一个协议(protocol):
protocol SearchVCDelegate {
func goBack()
}
View Controller 符合协议(protocol):
class SearchVC: UIViewController,SearchVCDelegate {
var delegate:SearchVCDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.delegate = self
}
有一个按钮会将用户带回并调用委托(delegate)方法:
@IBAction func actBack(sender: AnyObject?) {
print("actBack():\(isSearch)")
if let _ = delegate {
delegate?.goBack()
}
self.navigationController?.popViewControllerAnimated(true)
}
以及实现的Delegate方法,这里我将isSearch
设置为true
,输出为true
,这是正确的:
func goBack() {
isSearch = true
print("goBack():\(isSearch)")
}
现在当我再次点击返回时。输出显示 false
,但我已将其设置为 true
。
总体输出如下:
SearchSelfSegue:false //I went to next view
actBack():false //clicked back button
goBack():true //delegate method executed
actBack():false //clicked back again, this should be true.
最佳答案
如果您继续访问同一个 viewController,您实际上是在创建该 viewController 的一个新实例并继续访问该实例。您设置委托(delegate)的方式是每个 View Controller 都将成为其自身的委托(delegate),因此当您单击第二个 viewController 中的后退按钮时,您将在第二个 View Controller 中更改 isSearch
变量 View Controller 。第一个 viewController 中的 isSearch
不会更改。
我不明白你为什么要这样做,但如果你确定你在做什么,你应该将 self
设置为 delegate
新创建的 viewController 而不是原来的 viewController。
为此,请首先从 viewDidLoad()
方法中删除 self.delegate = self
,然后修改 prepareForSegue
,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SearchSelfSegue" {
if let destVC = segue.destinationViewController as? SearchVC {
//Set this viewController as the delegate of the new viewController
destVC.delegate = self
print("SearchSelfSegue:\(isSearch)")// output: false
}
}
}
关于ios - self 隔离并委托(delegate)奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39769990/