Контроллеры модального представления появляются за листом действий

Мои контроллеры модального представления отображаются за моим UIActionSheet, и мой UIActionSheet не удаляется. Я использую:

[self presentModalViewController:composeTweetView animated:YES];

Чтобы представить мой контроллер модального представления.

Мой лист действий отображается из tabBar:

[actionSheet showFromTabBar:self.parentViewController.tabBarController.tabBar];

Этот код работал на iOS 4.0.

if (buttonIndex == 0) {
        if (self.isLoggedIn) {
            [FlurryAPI logEvent:@"ST_REPLY_CLICKED"];
            composeTweetView.isDirectMessage = FALSE;
            [self presentModalViewController:composeTweetView animated:YES];
            [composeTweetView release];
        }
        else {
            LoginViewController* loginView = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
            loginView.delegate = self;
            loginView.isPostingComment = TRUE;
            self.isReply = TRUE;
            [self presentModalViewController:loginView animated:YES];
            [loginView release];
            [composeTweetView release];
        }
    }

Резюме:

У меня есть UIViewController, содержащий UITabBar. Я представляю таблицу UIActionSheet, в которой есть несколько кнопок, представляющих контроллер модального представления. Когда представлен контроллер модального представления, UIActionSheet должен закрыться, а модальное представление должно быть наверху стека. Проблема в том, что UIActionSheet не закрывается, а модальное представление загружается за ним. Эта проблема не возникала до iOS 4.2.1.

Шаги по воспроизведению:

  1. Создайте проект TabBar, установив для вашего Base SDK значение iOS 4.2.1.
  2. Создайте кнопку или триггер для отображения таблицы UIActionSheet.
  3. Разрешите одной из кнопок в UIActionSheet представить контроллер модального представления, используя синтаксис: [actionSheet showFromTabBar:self.parentViewController.tabBarController.tabBar];

Ожидаемые результаты:

1. The UIActionSheet should dismiss itself, and the modal view should appear in front

Фактические результаты:

1. The UIActionSheet does not get dismissed and the modal view appears behind it.

Регрессия:

This problem was not apparent prior to iOS 4.2.1

Примечания. Я пробовал другие способы отображения таблицы UIActionSheet, все из которых не работают должным образом:

//[actionSheet showInView:self.parentViewController.tabBarController.tabBar];
//[actionSheet showInView:[self.view window]];
//[actionSheet showInView:self.parentViewController.tabBarController.view];
//[actionSheet showInView:[UIApplication sharedApplication].keyWindow];

person Sheehan Alam    schedule 15.12.2010    source источник
comment
в 4.2 он работает? На самом деле я тестировал приложение в 4.2, оно работает нормально.   -  person Satya    schedule 21.12.2010
comment
работает в 4.2. Не работает в 4.2.1   -  person Sheehan Alam    schedule 22.12.2010
comment
откуда ты 4.2.1 взял? В моем DevCenter последний XCode от 22 ноября и содержит 4.2, а не 4.2.1.   -  person    schedule 22.12.2010
comment
еще одна вещь, ломающаяся / непрочная с каждым приращением iOS SDK.   -  person Jonathan.    schedule 22.12.2010


Ответы (8)


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

actionSheet:didDismissWithButtonIndex:

вместо того

actionSheet:clickedButtonAtIndex:

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

person Matthew Frederick    schedule 20.12.2010
comment
Единственные методы делегирования, которые я использую: - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex нужно ли мне вручную закрыть список действий? - person Sheehan Alam; 20.12.2010
comment
По-прежнему не повезло :( с новым методом делегата - person Sheehan Alam; 22.12.2010

Я не понимаю вашей проблемы, извините, но у меня все отлично работает. Я пробовал следующий код в Simulator и на iPod Touch 4G 4.2.1 (оба работали)

- (IBAction)doit {
    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"title" delegate:self cancelButtonTitle:@"not OK" destructiveButtonTitle:@"Absolutely" otherButtonTitles:nil];
    [actionSheet showFromTabBar:self.tabBarController.tabBar];
    [actionSheet release];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0) {
        UIView *v = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
        v.backgroundColor = [UIColor redColor];
        [self.view addSubview:v];
        [v release];
    }
}
  1. создал образец проекта TabBar
  2. добавлена ​​кнопка в firstView-nib и подключена к соответствующему IBAction (от FileOwner до FirstViewController)
  3. установите метод делегата в FirstViewController.h (<UIActionSheetDelegate>)
  4. добавил код выше

// РЕДАКТИРОВАТЬ: хорошо, я видел, что вы хотите представить это модально, но даже это работает для меня на 4.2.1

TMPController *tmp = [[TMPController alloc]initWithNibName:@"TMP" bundle:nil];
[self presentModalViewController:tmp animated:YES];
[tmp release];

может это сработает, потому что я использую self.tabBarController.tabBar, попробуйте это

person Community    schedule 22.12.2010
comment
так что попробуйте эту вещь self.tabBarController.tabBar;) - person ; 25.12.2010
comment
[actionSheet showFromTabBar: self.parentViewController.tabBarController.tabBar]; //не повезло - person Sheehan Alam; 03.01.2011
comment
хм действительно странно, какое устройство вы используете? потому что на моем iPod Touch 4G iOS 4.2.1 (8C148) он работает должным образом. Попробуйте использовать другое устройство или другую среду XCode - person ; 03.01.2011
comment
я использую iPhone 4 для тестирования - person Sheehan Alam; 13.03.2011

Не уверен, что вы уже решили эту проблему. Но четкого ответа выше я не увидел. У меня была точно такая же проблема, как и у вас. Итак, в конце концов, это была проблема с моей стороны, но что помогло мне отладить это, так это добавление фактического кода действия в метод

actionSheet:didDismissWithButtonIndex: 

как предложил Мэтью.

Это доказало, что мнение было отклонено. Именно тогда я понял, что помещаю UIActionSheet в свой метод viewWillAppear. Таким образом, каждый раз, когда появляется представление, он воссоздает лист действий.

person Yenyi    schedule 31.03.2011

Это кажется странным, поскольку документация SDK заявляет:

actionSheet: clickedButtonAtIndex:… Получатель автоматически закрывается после вызова этого метода.

Я могу придумать 3 варианта, почему он может не исчезнуть:

  1. Основной цикл выполнения (основной поток!), Который обрабатывает анимацию и отображение, не вызывается. Вы работаете с чем-то тяжелым в своем основном потоке, например, с синхронными сетевыми вызовами? (обратите внимание на слово "после" в тексте SDK)
  2. Каким-то образом вы планируете показывать лист действий несколько раз
  3. Вы модально отображаете тот же экземпляр контроллера представления, который уже находится где-то ниже текущего представления в стеке представлений.
person Dunkelstern    schedule 15.12.2010
comment
Я не блокирую цикл выполнения, все асинхронно, а таблица действий вызывается только один раз, вместе с контроллером модального представления, нет нескольких экземпляров. странно то, что это работало с тех пор, как я работал над iOS 3.0 ... - person Sheehan Alam; 16.12.2010

Я просто написал небольшой пример приложения, чтобы проверить это, и оно сработало так, как я ожидал (т.е. я не смог воспроизвести вашу проблему). Это было немного иначе, поскольку я не создавал приложение TabBar, но я все еще надеюсь, что это поможет. Что я сделал с UIActionSheet, так это показать это так: [actionSheet showInView:self.view]. Может, это сработает?

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

person donkim    schedule 20.12.2010
comment
[actionSheet showInView:self.view] у меня не сработало, к сожалению. те же результаты. странно, как мой код работает на всех версиях кроме iOS 4.2.1 - person Sheehan Alam; 20.12.2010

Я тоже сталкивался с подобными проблемами с iOS 4.2. Я думаю, вам следует попробовать следующие шаги:

  1. Создайте отдельный метод для кода, который вы хотите выполнить, нажав кнопку таблицы действий. предположим, что это метод - (void) presentModalView {}

2.Теперь в методе - (void) actionSheet: (UIActionSheet *) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex вызовите метод presentModalView {} для индекса нажатой кнопки, например это:

if(buttonIndex==0)
{
[self performSelector:@selector(presentModalView) withObject:nil afterDelay:0.3];
}

3. Вы также можете попробовать другое время задержки.

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

person iPhoneDev    schedule 21.12.2010
comment
не повезло. по-прежнему отображается за листом действий, который не закрывается. - person Sheehan Alam; 22.12.2010
comment
извините .. не могу вам помочь .. но я все еще не обновил свою iOS 4.2 до 4.2.1. Итак, не удалось воспроизвести проблему. - person iPhoneDev; 22.12.2010

У меня была та же проблема, что и при вызове MailComposeView из AlertBox / ActionSheet, из-за того, что MailCompseView находился за невидимым экраном.

Я решил это, вызвав dismissWithClickedButtonIndex: animated: в обработчике кнопки actionSheet.

person iphonezero    schedule 11.03.2011
comment
Я пробовал dismissWithClickedButtonIndex: animated: в обработчике, но не повезло - person Sheehan Alam; 13.03.2011

Проблема решена в iOS5.

person Sheehan Alam    schedule 27.06.2011