2017-01-08 1 views
0

У меня возникли проблемы с созданием программной панели UINavigationController. Я ранее использовал раскадровки, чтобы сделать это успешно, но хотел бы попробовать сделать все это в коде.IOS Swift Программно созданный элемент управления NavigationController TOOLBAR (нижняя панель) не работает

Я разработал UIBarButtonItems программно, но фактические функции или действия, которые они должны выполнять при нажатии, не работают.

Чтобы уточнить, я НЕ пытаюсь добавить элементы UIBarButtonItems в верхнюю панель. Я видел десятки вопросов, которые задавали одно и то же. Я имею в виду панель инструментов внизу, которая поставляется с UINavigationController. Это не означает, что нет "rightBarButtonItem" или "leftBarButtonItem"

Вот код:

class ProgOneViewController: UIViewController { 
    var chatRoomsButton: UIBarButtonItem = { 
     var button = UIBarButtonItem(title: "Chats", style: .plain, target: self, action: #selector(segueToChatRoomController(_:))) 
     return button 
    }() 

    var exploreButton: UIBarButtonItem = { 
     var button = UIBarButtonItem(title: "Explore", style: .plain, target: self, action: #selector(segueToExploreController(_:))) 
     return button 
    }() 

    var profileButton: UIBarButtonItem = { 
     var button = UIBarButtonItem(title: "Profile", style: .plain, target: self, action: #selector(segueToProfileController(_:))) 

     return button 
    }() 

    // Flexible spaces that are added in between each button. 
    var flexibleSpace1: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    var flexibleSpace2: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    var flexibleSpace3: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    var flexibleSpace4: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    // These are the functions that are not being called for some mysterious reason. 
    func segueToChatRoomController(_ sender: Any) { 
     print("segueing to chat rooms controller") 
     let chatRoomsController = ChatRoomsViewController() 
     let navController = UINavigationController(rootViewController: chatRoomsController) 
     self.present(navController, animated: false, completion: nil) 
    } 

    func segueToExploreController(_ sender: Any) { 
     print("segueing to explore controller") 
     let exploreController = ExploreCollectionViewController() 
     let navController = UINavigationController(rootViewController: exploreController) 
     self.present(navController, animated: false, completion: nil) 
    } 

    func segueToProfileController(_ sender: Any) { 
     print("segueing to profile controller") 
     let profileController = ProfileTableViewController() 
     let navController = UINavigationController(rootViewController: profileController) 
     self.present(navController, animated: false, completion: nil) 
    } 

    func setUpToolbar() { 
     print("setting up toolbar") 

     self.navigationController?.setToolbarHidden(false, animated: false) 
     self.navigationController?.toolbar.isUserInteractionEnabled = true 

     let toolBarItems = [flexibleSpace1, chatRoomsButton, flexibleSpace2, exploreButton, flexibleSpace3, profileButton, flexibleSpace4] 

     self.setToolbarItems(toolBarItems, animated: true) 
     // For some reason, these two methods leave the toolbar empty. 

     //self.navigationController?.setToolbarItems(toolBarItems, animated: true) 

     //self.navigationController?.toolbar.items = toolBarItems 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = UIColor.white 

     setUpToolbar() 
    } 

} 

EDIT * Вот код, который используется для создания экземпляра ProgOneViewController внутри UINavigationController

func pushToTestProgrammaticallyCreatedViews() { 
    let progOneViewController = ProgOneViewController() 
    let navController = UINavigationController(rootViewController: progOneViewController) 
    //navController.isToolbarHidden = false 
    //progOneViewController.setUpToolbar() 

    self.present(navController, animated: false, completion: nil) 
} 

я назвал эту функцию после нажатия кнопки в моем создаваемом раскадровкой контроллере представления. Функциональная подпись была длинной, чтобы указать, какие viewControllers были испытаниями (созданы программно):

+0

FYI - вам нужно только одно гибкое пространство. Его можно использовать несколько раз на той же панели инструментов. – rmaddy

+0

Спасибо за подсказку. Я полагал иначе, потому что просмотр списка подматричек контроллера просмотра обычно выглядит в раскадровке. –

ответ

1

Прежде всего, вы должны убедиться, что ваш ProgOneViewController действительно включен в UINavigationController. если это так, отображается панель инструментов, а также barbuttonitems (пробовал ваш код в моем проекте).

за исключением того, что вы должны изменить все свои объявления barbuttonitem на lazy var, чтобы ссылки на self в объявлениях указывали на viewcontroller и target-action.

не стесняйтесь спрашивать, есть ли какие-либо вопросы :)

+0

Спасибо! Я очень ценю это. И у меня был viewController, встроенный в контроллер навигации. Он был объявлен в другом виде контроллером. Ключевое слово lazy - это то, что мне нужно исследовать. но еще раз спасибо! –

Смежные вопросы