Контроллеры модального вида появляются за листом действий - PullRequest
2 голосов
/ 15 декабря 2010

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

[self presentModalViewController:composeTweetView animated:YES];

Для представления моего модального контроллера вида.

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

[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, установка базового 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];

Ответы [ 8 ]

2 голосов
/ 22 декабря 2010

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

- (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попробуйте это

2 голосов
/ 20 декабря 2010

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

actionSheet:didDismissWithButtonIndex:

вместо

actionSheet:clickedButtonAtIndex:

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

1 голос
/ 31 марта 2011

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

actionSheet:didDismissWithButtonIndex: 

в соответствии с предложением Матфея.

Это доказало, что мнение фактически было отклонено. Именно тогда я понял, что поместил UIActionSheet alloc в мой метод viewWillAppear. Поэтому каждый раз, когда появляется представление, оно воссоздает лист действий.

0 голосов
/ 27 июня 2011

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

0 голосов
/ 11 марта 2011

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

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

0 голосов
/ 21 декабря 2010

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

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

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

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

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

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

0 голосов
/ 20 декабря 2010

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

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

0 голосов
/ 15 декабря 2010

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

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

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

  1. Основной цикл запуска (основной поток!), Который обрабатывает анимацию и материал для отображения, не вызывается. Вы работаете над чем-то тяжелым в своем основном потоке, как синхронные сетевые вызовы? (обратите внимание на слово «после» в тексте SDK)
  2. Каким-то образом вы планируете показывать лист действий несколько раз
  3. Вы отображаете тот же экземпляр контроллера представления модально, который уже находится где-то ниже текущего представления в стеке представления.
...