dismissModalViewControllerAnimated nonatomic? - PullRequest
2 голосов
/ 21 июля 2009

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

Моя проблема в том, что я вызываю dismissModalViewController для средства выбора изображений, затем вызываю presentmodalviewcontroller для моего интерфейса электронной почты, но средство выбора изображений не уходит вовремя для представления представления электронной почты. Есть ли способ «дождаться» завершения этой строки кода?

(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
  if( [[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:@"public.image"] ){
    [self dismissModalViewControllerAnimated:YES];
    imageFromCamera = [[UIImageView alloc] initWithImage:[info objectForKey:UIImagePickerControllerOriginalImage]];

  MFMailComposeViewController *mailView = [[MFMailComposeViewController alloc] init];
  mailView.mailComposeDelegate = self;
  [self presentModalViewController:mailView animated:YES];
  [mailView release];

}   
}

Я почти уверен, что спроектировал что-то не так, но помогите, если сможете.

Ответы [ 5 ]

6 голосов
/ 21 июля 2009

Вы можете использовать performSelector:withObject:withDelay:, чтобы подождать, пока пройдет определенное время (создайте другой метод, у которого есть код для выполнения позже.

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

Я думаю, что вы, вероятно, могли бы что-то сделать с viewDidAppear:, ищите флаг, который вы установили в didFinishPicking…, указывающий, что вы ждете окончания анимации imagePicker. Так как это было сделано, анимация должна быть сделана к тому времени.

2 голосов
/ 23 августа 2010

Во время перехода все представления находятся в промежуточном представлении (типа UITransitionView). Так что просто выберите какой-либо выход, о котором вы знаете, что это прямое подпредставление главного окна, и проверьте, !([[outlet superview] isKindOfClass:[UIWindow class]]) и отложите ли выполнение, используя performSelector:withObject:withDelay:, передайте всю необходимую информацию для вызова того же метода, в котором вы находитесь, и просто вернуться.

Как только переход завершится, условие больше не будет выполнено, и может появиться новая анимация. Этот метод не подвержен сложностям синхронизации, которые могут произойти, если вы просто вызовете performSelector:withObject:withDelay: один раз.

Я использовал это совсем недавно, и он работает очень хорошо (у меня просто получилось, что выход в главное окно делает это еще проще):

//Called after [initialRootViewController dismissModalViewControllerAnimated:YES]
- (void)showTable {
    if([initialRootViewController.view superview] != window) {
        //View is still animating
        [self performSelector:@selector(showTable) withObject:nil afterDelay:0.1];
        return;
    }
    self.nibContents = [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil];
    [UIView transitionFromView:initialRootViewController.view toView:rootViewController.view duration:0.3 options:UIViewAnimationOptionTransitionCurlUp|UIViewAnimationOptionBeginFromCurrentState completion:^(BOOL finished){
        self.initialRootViewController = nil;
    }];
}
2 голосов
/ 19 августа 2009

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

if ([self retainCount] == 1) 
  [self dismissModalViewControllerAnimated:YES];                    
else {
  [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
}

- (void)onTimer:(NSTimer*)theTimer {
    [self dismissModalViewControllerAnimated:YES];
    [theTimer invalidate];
}

Проблема, которую я заметил, заключается в том, что здесь возникает проблема синхронизации, когда некоторый объект освобождает удержание на контроллере модального представления. И если я вызываю dismissModalViewController, когда retainCount по-прежнему равен 2, то вызов просто сбой ... ничего не происходит. Но если я подожду секунду, счетчик сохранения всегда падает до 1, а затем вызов dismissModalViewController завершается успешно.

0 голосов
/ 06 марта 2012

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

Вот что у меня сработало (Group и BigBlockViewController - мои классы):

Group *workAround = bigBlockViewController.selectedGroup;
[picker dismissModalViewControllerAnimated:YES];
bigBlockViewController.selectedGroup = workaround;

Мой сборщик фотографий выполняется из flipsideViewController

0 голосов
/ 30 августа 2011

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

root vc представляет изображение vc
root vc удаляет изображение vc
[одновременное отклонение и наличие причины проблемы здесь]
root vc представляет электронную почту vc
root vc отклоняет электронную почту vc

Вы делаете:

root vc представляет изображение vc
изображение vc представляет электронную почту vc
root vc отклоняет стек vc

Имейте в виду, что dismissModalViewController может отклонить целый стек контроллеров, чтобы добраться до вызывающего. См. Документацию для UIViewController .

vc = View Controller

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