[英]Self Segue & delegate weird behaviour
我已經創建了一個從按鈕到視圖控制器本身的自檢功能 ,即,單擊按鈕時視圖將自動顯示。
我在視圖控制器中聲明了一個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.
如果您選擇相同的viewController,則實際上是在創建該viewController的新實例並對其進行選擇。 你已經設置了委托的方式是,每個視圖控制器將自身的代表,所以當你從你的第二個的viewController點擊后退按鈕你改變isSearch
變量在第二的viewController。 該isSearch
從第一的viewController不會改變。
我不明白為什么要這樣做,但是如果您確定自己在做什么,則應該將self
設置為新創建的viewController的delegate
,而不是原始的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
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.