PersonViewController в TabBarController

У меня есть UITabBarController с тремя вкладками. Когда кто-то нажат, я хотел бы, чтобы пользователь сразу увидел контроллер вида человека (экземпляр класса ABPersonViewController).

Я не хочу просто использовать метод presentViewController() с контроллером представления человека как параметр, потому что это приводит к задержке, когда пользователь может видеть базовый контроллер представлений, из которого он был представлен.

Я также не могу заставить контроллер представления наследовать от ABPersonViewController, потому что он установлен Apple, так что он не может быть подклассифицирован. Есть ли способ, которым я могу это сделать?

Благодаря ответу JAL:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {

    let navViewController = viewController as! UINavigationController

    // First, check to see if the view controller is the one you want to override
    if let myViewController = navViewController.viewControllers[0] as? ThirdViewController {

        let abpvc = ABPersonViewController()
        abpvc.personViewDelegate = self
        self.navigationController?.pushViewController(abpvc, animated: true)
        return false

    }

    return true
}

Ответ 1

Используйте UITabBarDelegate метод shouldSelectViewController:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {

    // First, check to see if the view controller is the one you want to override 
    if let myViewController = viewController as? ViewControllerToOverride {
        // do something here, present a new view controller, etc.
        return false // then return false to prevent the tab from switching

}

Чтобы выбрать элемент панели вкладок (если вы используете изображение), измените UITabBarItem image или selectedImage. Поскольку вы возвращаете false при выборе вкладки, вам, вероятно, придется изменить свойство image, а не selectedImage.

self.tabBar.items?.first?.image = UIImage(...)

Ответ 2

Ответ

Существенной идеей является подкласс UITabBarController и установка UIButton на панели вкладок, закрытие исходной области табуляции и добавление к ней этой кнопки, которая вызовет соответствующие вызовы функций.

Так что событие tap фактически никогда не передается на tabBarController, а только на кнопку. Так что пользователь никогда не "увидит базовый контроллер представлений".

Пример кода

Пример кода Swift 1.2, который добавляет кнопку в центр UITabBarController

func AddSampleButton(){
    let SampleButton = UIButton()
    SampleButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    SampleButton.setBackgroundImage(addImage, forState: UIControlState.Normal)

    SampleButton.addConstraint(NSLayoutConstraint(item: addButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.view.frame.size.width/5))

    SampleButton.addConstraint(NSLayoutConstraint(item: addButton, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 50))

    self.view.addSubview(addButton)

    self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: addButton, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))

    self.view.addConstraint(NSLayoutConstraint(item: self.view, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: addButton, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0))

    SampleButton.enabled = true
    SampleButton.addTarget(self, action: "SampleAction", forControlEvents: UIControlEvents.TouchUpInside)
}

func SampleAction() {
    let abpvc = ABPersonViewController()
    abpvc.personViewDelegate = self
    self.navigationController?.pushViewController(abpvc, animated: true)
}

Ссылка

http://idevrecipes.com/2010/12/16/raised-center-tab-bar-button/

Примечание

Если вы не видите кнопку, помните о жизненном цикле UIViewContoller, вы можете стать источником вашей ошибки.