【问题标题】:ViewDidAppear not called automaticallyViewDidAppear 未自动调用
【发布时间】:2019-04-10 23:56:08
【问题描述】:

我有一个 HomeViewController 正在使用 segue 打开一个 WelcomeViewController 并且来自 Sheet 类型。

WelcomeViewController 中,用户正在输入信息,然后关闭(关闭)它。在WelcomeViewController 关闭后,我想通过更改StringTextField 值来更新HomeViewController

问题是,HomeViewController 中的 ViewDidAppear 在关闭 WelcomeViewController 后不会被调用。我之前为 iOS 开发时没有这个问题。

我该如何解决这个问题?我尝试手动调用它,但遇到了问题,因为我的 IBOutlets 设置为 nil,我无法更改 TextField 中的文本。

这是调用segue的代码:

self.performSegue(withIdentifier: "welcome", sender: self)

这是我在HomeViewController中的viewDidAppear

override func viewDidAppear() {
   super.viewDidAppear()
   if (CoreDataAccess().countUsers() == 0) {
       self.performSegue(withIdentifier: "welcome", sender: self)
   } else {
       //continue execution..
   }
}

WelcomeViewController 中,我使用此代码关闭ViewController

dismiss(self)

【问题讨论】:

  • 发布创建您的视图控制器/调用 segue 的代码,并发布您的 viewDidAppear 方法。 (你永远不应该调用那个方法。这就是 hte system 所做的。)
  • @DuncanC 我发布了代码
  • 使用委托。在您的情况下不会调用 viewDidAppear
  • 你的 outlet 不应该是 nil。您如何尝试将数据从welcomeViewController 传递回第一个屏幕?您需要显示更多代码。你的问题不清楚

标签: swift macos appkit nsviewcontroller


【解决方案1】:

将您的代码添加到 ViewWillAppear() 而不是 ViewDidAppear()。

或者你在关闭 WelcomeViewcontroller 时调用 HomeViewController 中的方法

dismiss(animated: true) {
   self.presentedViewController.myMethod()
}

【讨论】:

  • 不工作,ViewWillAppear() 在我关闭我的第二个 ViewController 后也没有被调用。
  • 在关闭 WelcomeViewcontroller 时调用 HomeViewController 中的方法dismiss(animated: true) { self.presentedViewController.myMethod() } 让我知道..
  • 是的,我可以调用一个方法,但这并不能帮助我访问我的 TextField。如果不调用 ViewDidAppear,我的 IBOutlets 将设置为 nil。
【解决方案2】:

这就是我使用delegate 解决它的方法。 感谢@ullstrm 的建议。

首先我将此协议添加到HomeViewController

protocol WelcomeDelegate {
    func insertData(_ name: String, birthday: Date)
}

然后这个prepare(for segue:)

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if let destinationViewController = segue.destinationController as? WelcomeViewController {
        destinationViewController.delegate = self
    }
}

这个扩展在底部(我知道手动调用 viewDidAppear 是不行的,但它现在可以工作)

extension HomeViewController : WelcomeDelegate {
    func insertData(_ name: String, birthday: Date) {
        viewDidAppear()
    }
}

然后在WelcomeViewController我添加了这个变量

var delegate:WelcomeDelegate? = nil

这一行就在dismiss(self)之前

self.delegate?.insertData(tfName.stringValue, birthday: dpAge.dateValue)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多