Swift:为不同的选项卡设置不同的导航栏按钮

时间:2016-11-06 10:42:16

标签: ios swift tabs navigationbar tabbar

我在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。

即使我点击之前显示的标签,我怎样才能使导航栏按钮相应改变?

2 个答案:

答案 0 :(得分:2)

我假设你将UITabBarController(或它的子类)嵌入到UIViewController中。这是错误的,因为在这种情况下,您倾向于使视图控制器通用,这通常是一种不好的做法。

相反,我建议将视图控制器的层次结构更改为您在下图中看到的内容。

enter image description here

<强>更新

如果您在代码中执行此操作:

@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
}

仍然,非常感谢!