我在Swift 3.0中创建了一个带有5个选项卡的自定义UITabBarController。我一直试图为某些标签设置不同的导航栏项目,但效果不佳。
情况:我在每个标签的viewDidLoad()中添加了可以更改导航栏按钮的代码。
//The customized Tab Bar controller instance. Contained in each of the tabs.
var mainController: TabBarController?
override func viewDidLoad() {
// ... more code
setupNavBar()
// ... more code
}
func setupNavBar() {
// ... more code
mainController?.navigationItem.leftBarButtonItem = UIBarButtonItem(image: friendsImage, style: .plain, target: self, action: #selector(handleFindFriends))
// ... more code
}
问题:让我们说Tab#1应该有NavBarButton A而Tab#2应该有NavBarButton B. 当我从Tab#1切换到Tab#2时,代码工作正常; NavBarButton从A变为B. 但是,当我单击选项卡#1时,NavBarButton仍然是B。
即使我点击之前显示的标签,我怎样才能使导航栏按钮相应改变?
答案 0 :(得分:2)
我假设你将UITabBarController
(或它的子类)嵌入到UIViewController
中。这是错误的,因为在这种情况下,您倾向于使视图控制器通用,这通常是一种不好的做法。
相反,我建议将视图控制器的层次结构更改为您在下图中看到的内容。
<强>更新强>
如果您在代码中执行此操作:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let tabBarController = UITabBarController()
// first tab
let firstViewController = UIViewController()
_ = firstViewController.view
firstViewController.title = "First"
let firstNavigationController = UINavigationController(rootViewController: firstViewController)
// sets a specific button ("Friends") on a navigation bar for the first screen
firstViewController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Friends", style: .plain, target: nil, action: nil)
// second tab
let secondViewController = UIViewController()
_ = secondViewController.view
secondViewController.title = "Second"
let secondNavigationController = UINavigationController(rootViewController: secondViewController)
// sets a specific button ("Photos") on a navigation bar for the second screen
secondViewController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Photos", style: .plain, target: nil, action: nil)
// embeds the navigation controllers into the tab bar controller
tabBarController.viewControllers = [firstNavigationController, secondNavigationController]
// creates a window with the tab bar controller inside
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = tabBarController
window?.makeKeyAndVisible()
return true
}
}
答案 1 :(得分:1)
我实际上找到了解决方案XD 在TabBarController中:
override func viewWillAppear(_ animated: Bool) {
//Original code to set up tabs
//Code I added:
for i in 0...4 {
tabBar.items?[i].tag = i
}
}
//Code I added:
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
//Code to run when a certain tab is selected
}
仍然,非常感谢!