我有一个奇怪的时机的问题,它似乎。 我打开一个uiimagepicker为模态的视图。 当用户选取的图像或我想借此形象,将其保存到一个变量,然后打开电子邮件接口作为modalview。
我的问题是,我在imagepicker调用dismissModalViewController,然后调用presentmodalviewcontroller我的电子邮件接口,但imagepicker是不会消失的时候将提交的电子邮件视图。 有没有一种方法,以“等待”该行的代码来完成?
(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];
}
}
我敢肯定,我设计了一些错误,但如果你能帮助我。
您可以使用performSelector:withObject:withDelay:
等待一个给定的时间通过(创建具有代码后做的另一种方法。
然而,这样会引入很多微妙的时机错误的,所以我建议使用它只是案件的最极端的。
我想你也许可以做一些与viewDidAppear:
寻找那些你在设置一个标志didFinishPicking…
这表明你等待imagePicker的动画结束。 由于它是didAppear,动画应该然后完成。
我遇到与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成功。
而过渡正在发生,所有视图驻留在(的类型的中间视图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;
}];
}
我有一个类似的问题,并认为这是一个设计问题。 我建议,而不是做的:
根VC呈现图像VC
根VC驳回图像VC
[同时驳回和本引起问题这里]
根VC呈现电子邮件VC
根VC驳回电子邮件VC
你做:
VC VC呈现根图像
VC VC图像呈现电子邮件
VC VC根解散堆叠
请记住,dismissModalViewController可以关闭控制器的整个堆栈去调用者。 请参阅该文档的UIViewController 。
VC = - 视图 - 控制器
我使用的是图片选择器和dismissModalViewControllerAnimated被撤消我的目标之一。 我发现,我必须保存和恢复我的价值。
这对我来说(集团BigBlockViewController是我班)什么工作:
Group *workAround = bigBlockViewController.selectedGroup;
[picker dismissModalViewControllerAnimated:YES];
bigBlockViewController.selectedGroup = workaround;
我的照片选择器从flipsideViewController执行