Self Segue&委托奇怪的行为

时间:2016-09-29 12:11:46

标签: ios swift delegates segue

我已经从按钮到视图控制器本身创建了一个 Self Segue ,即,当点击按钮时,视图将会自行运行。

我在视图控制器中声明了Bool变量isSearch

var isSearch! false

现在,当点击该按钮时,prepareForSegue会输出isSearchfalse,这是正确的:

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.

1 个答案:

答案 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
        }
    }
}