【发布时间】: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