【问题标题】:View did appear not called when view controller (SideMenu)视图控制器(SideMenu)时视图确实出现未调用
【发布时间】:2017-03-10 01:26:59
【问题描述】:

我一直在我的 iOS 应用程序(邮箱)中实现 SideMenu。 SideMenu 用于选择当前文件夹。我创建了一个 SideMenu 导航控制器并附加了一个 UITableViewController 作为根 vc。

它工作得非常好,直到我单击其中一个单元格,这会关闭侧面菜单并应将邮件加载到原始视图控制器中。但是,没有调用原始视图控制器的viewDidAppear 方法。当我尝试直接调用加载函数时,Xcode 说我的tableView 为 nil(它不是第一次加载时)。

这是我在 SideMenu 表中的 didSelectRowAtIndexPath 代码:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    currentFolder = folders[indexPath.row].path
    tableView.deselectRow(at: indexPath, animated: true)
    self.dismiss(animated: true) {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "mail") as! MailViewController
        vc.loadMail()
    }

}

这里是原始vc中的loadMail函数:

func loadMail(showsSpinner: Bool = true) {
    ...
    if let messages = fetchedMessages as? [MCOIMAPMessage] {
        self.mailsInFolder = messages
        SwiftSpinner.hide()
        self.refresher.endRefreshing()
        self.table.reloadData()
    }

}

另外,这里是原始vc中的viewDidAppear

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    print("viewDidAppear")
    let from = self.navigationController?.transitionCoordinator?.viewController(forKey: .from)
    if from is MessageViewController {
        print("from is message controller")//should not load
        return
    }
    self.loadMail()

}

这里没有调用viewDidAppear,也没有加载邮件。我能做些什么来解决这个问题?谢谢!

【问题讨论】:

  • instantiateViewController 并不意味着 viewDidLoad 被调用。
  • @creeperspeak 那我怎么称呼它?
  • 为什么不把loadMail 函数放在viewDidLoad 中的MailViewController 中。而不是仅仅实例化而不用MailViewController做任何事情,只需呈现它。要么制作故事板转场并执行转场,要么手动呈现MailVC(以模态方式或在导航控制器中,或其他方式)。这有帮助吗?
  • 我需要反复调用 loadMail(在 viewDidLoad 之外)。此外,不会调用 viewDidLoad。

标签: ios swift email viewdidappear


【解决方案1】:

我使用 SideMenu 已经有一段时间了,我建议你使用 mainViewController 一个 UINavigationController,然后在 rightViewController 中选择你的 tableView 的一个单元格时

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    currentFolder = folders[indexPath.row].path
    tableView.deselectRow(at: indexPath, animated: true)
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mail") as! MailViewController
    {
       mainNavController.setViewControllers([vc], animated: false)
    }
    homeSlide.slideMenuController()?.closeLeft()
}

希望对你有所帮助,问候

【讨论】:

  • 我对你使用的变量有点困惑......你能进一步解释一下吗?它现在似乎没有编译。
  • 你能定义变量吗?谢谢。
  • @penatheboss 你的 containerViewController 配置是什么?你能分享你的代码,你设置你的右菜单和 mainViewController 吗?
  • 我没有编码;我通过情节提要设置它
  • @penatheboss 但你的 mainViewController 是 UINavigationController?
猜你喜欢
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多