ios - self 隔离并委托(delegate)奇怪的行为

标签 ios swift delegates segue

我已经创建了一个从按钮到 View Controller 本身的自转,即,当单击按钮时, View 将转到自身。

我在 View Controller 中声明了一个 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):

protocol SearchVCDelegate {
    func goBack()
}

View Controller 符合协议(protocol):

class SearchVC: UIViewController,SearchVCDelegate {

    var delegate:SearchVCDelegate?

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

        self.delegate = self

    }

有一个按钮会将用户带回并调用委托(delegate)方法:

@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 的一个新实例并继续访问该实例。您设置委托(delegate)的方式是每个 View Controller 都将成为其自身的委托(delegate),因此当您单击第二个 viewController 中的后退按钮时,您将在第二个 View Controller 中更改 isSearch 变量 View Controller 。第一个 viewController 中的 isSearch 不会更改。

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

为此,请首先从 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
        }
    }
}

关于ios - self 隔离并委托(delegate)奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39769990/

相关文章:

ios - 如何将数组从 ViewController 文件发送到 Swift 文件(没有 View Controller )?

ios - 当一个对象为零但另一个对象不是时如何显示数据?

iOS 9 破坏了 UILabel 的动画

ios - HLS 视频无法在模拟器和真实设备上播放

swift - 如何快速获取类的可变副本?

c# - 返回委托(delegate)的 Lambda 表达式

c# - 分配 null 是否会从对象中删除所有事件处理程序?

objective-c - NSArray 深拷贝导致崩溃

swift - swift 中的 MKPointAnnotations 触摸事件

c# - 多播委托(delegate)和事件