Как открыть модальный с помощью UITabBarController и при закрытии отобразить отображение последней панели вкладок?
Итак, у меня есть UITabBarController
на одной раскадровке, в которой есть 3 кнопки. Двое из них открывают стандартные представления, связанные с панелью вкладок стандартными связями ассоциации... третий вопрос.
Я хотел бы открыть форму, которая живет в другой раскадровки (совместно используемой другими представлениями в приложении) в модальном виде, а после закрытия или отправки просто вернется к любой вкладке, которая ранее была активной в представлении с вкладками.
Я видел несколько "опций" там, но ни один из них не похож на то, что я ищу.
Любые идеи?
EDIT: он отредактирован из моего оригинального вопроса мод, но я пишу это в Swift... не Obj-C.
Ответы
Ответ 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. Конечно, вы по-прежнему рискуете, что кто-то переименует ваше свойство заголовка просмотров.
Ответ 2
Я имитировал то же самое, ссылаюсь на ссылку: - https://github.com/deepesh259nitk/MultipleStoryBoards/tree/master
- Запустите проект
- Нажмите на Tab2
- вы увидите 3 кнопки
- Нажмите на кнопку3
Ответ 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.