我有一个tableView到标签栏上的viewController。当我点击tabBar item时tableView没有刷新。但是我有viewWillAppear函数:
override func viewWillAppear(animated: Bool) {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
}
我试着用标签栏委托调用这个函数,但不工作:
func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
}
为什么不重新加载?
谢谢!
您不需要在此涉及选项卡栏控制器。这样做太过分了。您将创建令人困惑的代码,稍后有人会想要删除这些代码。在viewWillAppear(_:)
中更新表视图几乎总是最好的方法。
如果一切设置正确,你的视图控制器的viewWillAppear(_:)
方法将被调用,每次用户选择那个选项卡,你的视图变得可见。如果它没有被调用,你的标签栏和它的视图控制器的设计有问题。
创建一个新项目并选择Tabbed Application模板。打开SecondViewController文件,添加一个viewWillAppear(_:)
方法。在那里添加一个断点。每次切换到第二个选项卡,你都会看到它被调用。
其他一些想法…
您将注意到在viewWillAppear(_:)
文档中它说您必须始终调用super。你不是。你应该。但这与你的问题无关。
同样,也不需要切换到主队列。viewWillAppear(_:)
总是在主队列上被调用。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
回答迅速5.0
在主线程中重新加载UITableView
然后检查。我希望这对你有用。
override func viewWillAppear(_ animated: Bool) {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
你可以在这里找到答案:打开viewcontroller从选项卡,就像在IOS上的instagram相机页面
基本上,你需要创建一个继承自UITabBarController的控制器,并在Storyboard中将其设置为tabBarView的自定义类。
然后通过Storyboard为每个Tab设置Tags。
之后,你可以使用委托方法来调用一个操作,如果一个特定的选项卡被点击。
委托方法应该是这样的:
override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
switch item.tag{
case 1: //code here
break
default: break
}
}