2016-09-29 42 views
0

我已经创建了一个Self Segue从按钮到视图控制器本身,即当按钮被点击时视图将自动进入。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 
      } 
     } 
    } 

我有上面定义的协议视图控制器:

protocol SearchVCDelegate { 
    func goBack() 
} 

视图控制器符合协议:

class SearchVC: UIViewController,SearchVCDelegate { 

    var delegate:SearchVCDelegate? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 

     self.delegate = self 

    } 

有按钮,将采取用户返回,并委托方法将被调用:

@IBAction func actBack(sender: AnyObject?) { 
    print("actBack():\(isSearch)") 
    if let _ = delegate { 
     delegate?.goBack() 
    } 
    self.navigationController?.popViewControllerAnimated(true) 
} 

而实现的委托方法,在这里我设置isSearchtrue,并且输出是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

赛格瑞正在完善检查委托()。如果它是好的,那么使用NSUserDefault – JAck

回答

0

如果原因请看你实际上创建的viewController的新实例,并segueing到相同的viewController。你设置委托的方式是每个视图控制器都是它自己的委托,所以当你从你的第二个viewController点击后退按钮时,你将更改变量第二个 viewController。第一个viewController的isSearch不会被改变。

我不明白你为什么要这样做,但如果你确定你在做什么,你应该将self设置为新创建的viewController的delegate而不是原来的。

为了做到这一点,首先从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 
     } 
    } 
} 
+0

好抓!当我发布这个问题的时候,我自己就明白了。 :D,接受以供将来参考。 –