Может ли presentModalViewController работать при запуске? - PullRequest
5 голосов
/ 30 июля 2009

Я хотел бы использовать модальный UITableView при запуске, чтобы запросить у пользователей пароль и т. Д., Если они еще не настроены. Однако команда для вызова uitableview, похоже, не работает внутри viewDidLoad.

код запуска:

- (void)viewDidLoad {
  rootViewController = [[SettingsController alloc] 
    initWithStyle:UITableViewStyleGrouped];
  navigationController = [[UINavigationController alloc]     
    initWithRootViewController:rootViewController];

  // place where code doesn't work
  //[self presentModalViewController:navigationController animated:YES];
}

Тем не менее, тот же код отлично работает, когда вызывается позже кнопкой:

- (IBAction)settingsPressed:(id)sender{
    [self presentModalViewController:navigationController animated:YES];
}

Смежный вопрос: как я чувствую (на верхнем уровне), когда UITableView использовал команду для выхода?

[self.parentViewController dismissModalViewControllerAnimated:YES];

Ответы [ 3 ]

7 голосов
/ 30 июля 2009

Вы можете разместить вызов presentModalViewController:animated: в другом месте кода - он должен работать в методе viewWillAppear контроллера представления или в методе applicationDidFinishLaunching в делегате приложения (это место, где я размещаю свой запуск модальные контроллеры).

Что касается знания, когда контроллер представления исчезает, вы можете определить метод на родительском контроллере представления и переопределить реализацию dismissModalViewControllerAnimated на дочернем контроллере для вызова метода. Примерно так:

// Parent view controller, of class ParentController
- (void)modalViewControllerWasDismissed {
    NSLog(@"dismissed!");
}

// Modal (child) view controller
- (void)dismissModalViewControllerAnimated:(BOOL)animated {
    ParentController *parent = (ParentController *)(self.parentViewController);
    [parent modalViewControllerWasDismissed];

    [super dismissModalViewControllerAnimated:animated];
}
6 голосов
/ 13 февраля 2010

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

// ModalViewController initialization
- (void) presentStartUpModal 
{
    ModalStartupViewController *startUpModal = [[ModalStartupViewController alloc] initWithNibName:@"StartUpModalView" bundle:nil];
    startUpModal.delegate = self;

    [self presentModalViewController:startUpModal animated:YES];
    [startUpModal release]; 
}

Далее, в viewDidLoad, вызовите ваш метод определения способа в performSelector:withObject:afterDelay: с 0 в качестве значения задержки. Как это:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //[self presentStartUpModal];  // <== This line don't seems to work but the next one is fine.
    [self performSelector:@selector(presentStartUpModal) withObject:nil afterDelay:0.0];
}

Я до сих пор не понимаю, почему «стандартный» способ не работает.

0 голосов
/ 30 июля 2009

Если вы собираетесь сделать это таким образом, вам нужно будет объявить свой собственный протокол, чтобы иметь возможность определить, когда UITableView отклонил parentViewController, поэтому вы объявляете протокол, который имеет метод, подобный

-(void)MyTableViewDidDismiss

затем в родительском классе вы можете реализовать этот протокол, а после dismissModalView в tableView вы можете вызвать MyTableViewDidDismiss для делегата (который является родительским контроллером представления).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...