Подтвердить что ты не робот

Как открыть модальный с помощью UITabBarController и при закрытии отобразить отображение последней панели вкладок?

Итак, у меня есть UITabBarController на одной раскадровке, в которой есть 3 кнопки. Двое из них открывают стандартные представления, связанные с панелью вкладок стандартными связями ассоциации... третий вопрос.

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

Я видел несколько "опций" там, но ни один из них не похож на то, что я ищу.

Любые идеи?

EDIT: он отредактирован из моего оригинального вопроса мод, но я пишу это в Swift... не Obj-C.

4b9b3361

Ответ 1

Итак, у меня есть потенциальное решение, которое работает с использованием пустого контроллера представлений, shouldSelectViewController и UITabBarController Delegate. Единственная проблема: я не очень доволен тем, насколько хрупким она является.

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

    // This is a bit dangerous if we move where 'newController' is located in the tabs, this will break.
    let newController = viewControllers![1] as! UIViewController

    // Check if the view about to load is the second tab and if it is, load the modal form instead.
    if viewController == newController {
        let storyboard = UIStoryboard(name: "ModalController", bundle: nil)
        let vc = storyboard.instantiateInitialViewController() as? UIViewController

        presentViewController(vc!, animated: true, completion: nil)

        return false
    } else {
        return true
    }
}

Это прекрасно работает, но если кто-то должен был прийти и перестроить порядок вкладок в раскадровке, это сломается.

Также, чтобы дать кредит @rmp, другие параметры: "Если вы предоставляете заголовок для всех ваших корневых представленийControllers, которые составляют вкладки в вашем tabBarController, чем вы можете использовать viewController.title, чтобы проверить, какая вкладка была использована в mustSelectViewController. Конечно, вы по-прежнему рискуете, что кто-то переименует ваше свойство заголовка просмотров.

Ответ 3

Похоже, вам не нужна вкладка, вкладки должны содержать представление и не показывать новое/модальное представление. Однако есть случаи, когда то, что вы хотите сделать, имеет смысл, так как некоторые приложения будут использовать центральную вкладку в качестве кнопки для добавления нового элемента или выполнения некоторых действий (пример Yelp - хороший пример). В этих случаях вкладка обычно больше или визуально отличается от того, что она не является вкладкой. Это то, что я думаю, что ты действительно на самом деле.

Для этого вам необходимо:

  • Создайте вкладку в tabBar, это будет просто владелец места
  • Создайте значок или изображение, которое будет использоваться в качестве кнопки, которая перейдет на вкладку "Заполнитель"
  • Используйте viewWillLayoutSubviews вашего класса tabBarController, чтобы поместить эту кнопку на вкладку "Заполнитель". См. Ниже (код примера портрета).
  • Добавьте действие к кнопке, которая представит ваше модальное представление.

Примечание: вам может потребоваться настроить размещение кнопки, используя код ниже, чтобы соответствовать вашим потребностям.

-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];

            if (UIDeviceOrientationIsPortrait && !centerTabButton) {

                //CUSTOM CENTER TAB BAR BUTTON
                UIImage *buttonImage = [UIImage imageNamed:@"icn_CenterTabBarIcon.png"];
                UIImage *highlightImage = [UIImage imageNamed:@"icn_CenterTabBarIcon.png"];

                centerTabButton = [UIButton buttonWithType:UIButtonTypeCustom];
                centerTabButton.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
                [centerTabButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
                [centerTabButton setBackgroundImage:highlightImage forState:UIControlStateHighlighted];
                [centerTabButton setShowsTouchWhenHighlighted:FALSE];
                [centerTabButton setAdjustsImageWhenHighlighted:FALSE];
                [centerTabButton addTarget:self action:@selector(centerTabClicked:) forControlEvents:UIControlEventTouchUpInside];

                CGFloat heightDifference = buttonImage.size.height - self.tabBar.frame.size.height;

                //center the button on the tab bar based on the tab bar height
                if (heightDifference < 0){
                    centerTabButton.center = self.tabBar.center;
                }
                else{
                    CGPoint center = self.tabBar.center;
                    center.y = center.y - heightDifference/2.0;
                    centerTabButton.center = center;
                }

                [self.view addSubview:centerTabButton];
            }
        }

Ответ 4

Чтобы ответить на второй вопрос о том, что он "хрупкий"

Если вы предоставили заголовок для всех ваших корневых представленийControllers, которые составляют вкладки в tabBarController, чем вы, вы можете использовать viewController.title, чтобы проверить, какая вкладка была использована в делегате shouldSelectViewController. Конечно, вы по-прежнему рискуете, что кто-то переименует ваше свойство title.