簡體   English   中英

自檢和委派怪異行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM