我已经从按钮到视图控制器本身创建了一个 Self Segue ,即,当点击按钮时,视图将会自行运行。
我在视图控制器中声明了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 SearchVCDelegate {
func goBack()
}
View Controller符合协议:
class SearchVC: UIViewController,SearchVCDelegate {
var delegate:SearchVCDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.delegate = self
}
有一个Button将用户返回并调用委托方法:
@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.
答案 0 :(得分:0)
如果您转向同一个viewController,那么您实际上正在创建该viewController的新实例并将其转换为该实例。您设置委托的方式是每个视图控制器都是自己的委托,所以当您从第二个viewController单击后退按钮时,您需要更改第二个中的isSearch
变量< / strong> viewController。来自第一个viewController的isSearch
不会被更改。
我不明白为什么你会这样做但如果你确定自己在做什么,你应该将self
设置为delegate
新创建的viewController而不是原始的。
为此,请先从self.delegate = self
方法中删除viewDidLoad()
,然后按照以下方式修改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
}
}
}