2016-09-29 40 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,接受以供將來參考。 –