【问题标题】:Self Segue & delegate weird behaviour自我 Segue 和委托怪异行为
【发布时间】:2016-09-29 12:11:45
【问题描述】:

我创建了一个 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
            }
        }
    }

我在 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方法,这里我设置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.

【问题讨论】:

  • segue 正在对 delegate() 进行完美检查。如果没问题,那么使用 NSUserDefault

标签: ios swift delegates segue


【解决方案1】:

如果你继续使用同一个 viewController,你实际上是在创建该 viewController 的一个新实例并继续使用它。您设置委托的方式是每个视图控制器都将成为其自身的委托,因此当您从第二个视图控制器单击后退按钮时,您将更改该 second 视图控制器中的 isSearch 变量.第一个 viewController 中的 isSearch 不会改变。

我不明白你为什么要这样做,但如果你确定你在做什么,你应该将 self 设置为新创建的 viewController 而不是原来的 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
        }
    }
}

【讨论】:

  • 好收获!在我发布这个问题的那一刻,我自己想通了。 :D , 接受以供将来参考。
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
相关资源
最近更新 更多