iPhone - Уволить модальный вид с помощью UITabBarController - PullRequest
0 голосов
/ 27 апреля 2010

У меня очень странная проблема. Я создал свой собственный UITabBarController, чтобы настроить его, и он работает довольно хорошо ... за исключением модальных представлений. Когда я отклоняю модальное представление (представить / отклонить из UITabBarController) с анимацией, он ждет, пока анимация не закончилась, и переходит к первому контроллеру панели вкладок!

Почему меняется контроллер? и как я могу это исправить?

Спасибо

PS: мое представление UITabBarController находится в главном окне и имеет UITabBar. Контроллеры (которые управляются панелью вкладок) находятся в главном окне над видом контроллера панели вкладок с меньшей высотой. Когда я представляю модальный вид, я переношу вид контроллера панели вкладок на передний план.

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Прочитав ваш комментарий к моему первому ответу, я лучше понимаю, что вы делаете, хотя выяснить, что идет не так, очень сложно, не увидев код. Я создал другой проект с настраиваемым контроллером панели вкладок (подклассами от UIViewController), где в одном представлении с вкладками есть кнопка, представляющая контроллер модального представления. Когда я отклоняю модальное представление, он возвращается к вкладке, на которой я находился.

В своем вопросе вы говорите, что ваши контроллеры представления, управляемые панелью вкладок, находятся в главном окне, и когда вы представляете модальное представление, вы выводите представление контроллера панели вкладок вперед. Это не имеет смысла для меня.

Для моего примера я сделал CustomTabBarController подклассом UIViewController и сделал переменные экземпляра для панели вкладок с двумя элементами панели вкладок и двумя контроллерами представления. Я добавил панель вкладок и оба представления контроллеров представлений участников как подпредставления представления CustomTabBarController (я установил кадры представлений контроллеров представления, чтобы они не перекрывали панель вкладок). Я также установил CustomTabBarController в качестве делегата панели вкладок. Когда элемент панели вкладок выбран, я отправляю сообщение bringSubviewToFront: представлению CustomTabBarController с соответствующим подпредставлением в качестве аргумента.

В одном из представлений контроллеров представлений элементов есть кнопка, которая при касании представляет модальное представление. Контроллер представления может вызвать presentModalViewController:, когда кнопка нажата, но, поскольку вы сказали, что ваш контроллер панели вкладок делает это, у меня есть метод IBAction в контроллере представления (это цель кнопки, которая представляет модальное представление) который вызывает в CustomTabBarController метод, который вызывает presentModalViewController:. Контроллер вида имеет ивар для CustomTabBarController (поскольку контроллер вида принадлежит CustomTabBarController, его было легко установить).

В классе контроллера модального вида также есть ivar для CustomTabBarController (я установил это непосредственно перед вызовом presentModalViewController:), и у меня есть кнопка в модальном виде, которая отклоняет модальное представление. Эта кнопка подключается к IBAction в классе контроллера модального представления, который затем вызывает метод в CustomTabBarController.

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

0 голосов
/ 12 июля 2010

Я подозреваю, что вы выполняете большую (слишком большую?) Работу по инициализации в viewDidLoad, и одна из этих вещей - выбор первой вкладки?

Может быть, вы можете поделиться с нами последовательностью init / load в вашем собственном классе контроллера панели вкладок?

Ваше представление контроллера панели вкладок может быть выгружено, когда отображается модальное представление, и перезагружено (вызывая viewDidLoad), когда модальное отклонено.

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

0 голосов
/ 27 апреля 2010

У меня есть несколько вопросов:

1) Когда вы говорите «создал мой собственный UITabBarController», вы имеете в виду, что вы подклассировали UITabBarController?

2) Как делается вызов для представления контроллера модального вида? Есть ли кнопка или что-то, что вызывается, чтобы сделать вызов модального контроллера представления?

Вы говорите, что контроллеры "находятся в главном окне" и что, когда вы представляете модальное представление, вы "переносите вид контроллера панели вкладок вперед". Это смущает меня. Контроллеры представления должны «принадлежать» контроллеру панели вкладок.

Я создал небольшой проект, и он работал на меня, поэтому вот что я сделал:

1) Я создал подкласс UITabBarController:

@interface MyTabBarController : UITabBarController
{
}

- (IBAction)presentModalView:(id)sender;
- (void)dismissModalview;

@end


@implementation MyTabBarController

- (IBAction)presentModalView:(id)sender
{
    MyModalViewController* myModalView = [[MyModalViewController alloc] initWithNibName:@"ModalView" bundle:nil];
    [myModalView setTbc:self];
    [self presentModalViewController:myModalView animated:YES];
}

- (void)dismissModalview;
{
    [self dismissModalViewControllerAnimated:YES];
}
@end

2) Затем для моего контроллера модального вида я создал подкласс UIViewController:

@interface MyModalViewController : UIViewController
{
    MyTabBarController* tbc;
}

@property (retain) MyTabBarController* tbc;

- (IBAction)returnToTabBar:(id)sender;

@end


@implementation MyModalViewController

@synthesize tbc;

- (IBAction)returnToTabBar:(id)sender;
{
    [tbc dismissModalview];
}

@end

3) Я перетащил контроллер панели вкладок в MainWindow.xib, установил для его владельца файла MyTabBarController и добавил контроллеры представления для обеих вкладок (я установил цвета фона каждой из них на разные цвета с помощью инспектора). В контроллере представления второй вкладки я добавил кнопку и установил ее целевое значение для действия «presentModalView:» в MyTabBarController.

4) Я создал новый xib, содержащий представление с именем ModalView, и установил для его владельца файла MyModalViewController. Я установил цвет фона вида, отличный от двух выше, и добавил кнопку к виду. Я установил в качестве цели кнопки действие returnToTabBar: в MyModalviewController.

Очевидно, мне пришлось добавить представление панели вкладок к подпредставлению окна в делегате приложения. Это сработало для меня и представило модальный контроллер представления, когда я был на второй вкладке, и когда я отклонил его, я был возвращен на вторую вкладку в контроллере панели вкладок.

Надеюсь, это поможет!

...