dismissModalViewControllerAnimated非原子?
我有一个奇怪的时间问题,看来。我打开一个uiimagepicker作为模态视图。当用户选择一个图像或我想拍摄图像时,将其保存到一个变量中,然后打开一个电子邮件界面作为模态视图。dismissModalViewControllerAnimated非原子?
我的问题是,我在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];
}
我注意到的问题是,这里是当一些物体释放它的模态视图控制器保持周围的计时问题。如果我在retainCount仍然是2时调用dismissModalViewController,那么调用就会失败......没有任何反应。但是,如果等待一秒钟,保留计数总是下降到1,然后调用dismissModalViewController成功。
这对我有用。谢谢! – 2010-02-06 21:39:42
当过渡发生时,所有视图都驻留在中间视图中(类型为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;
}];
}
这个方法对我很好。我改变了测试,所以我检查了initialRootViewController.view superview!= NULL。当视图完成动画时,它变为NULL。 – 2012-03-07 08:24:12
我有一个类似的问题,并认为它是一个设计问题。我建议,而不是这样做的:
根VC呈现图像VC
根VC驳回图像VC
[同时解雇和在座的原因的问题]
根VC呈现电子邮件VC
根VC驳回电子邮件VC
你这样做:
根VC呈现图像VC
图像VC预sents电子邮件vc
root vc关闭vc栈
请记住,dismissModalViewController可以关闭整个控制器堆栈以便到达调用者。请参阅UIViewController的文档。
VC = - 视图 - 控制器
我使用的图像拾取和dismissModalViewControllerAnimated被撤消我的目标之一。我发现我必须保存和恢复我的价值。
这对我来说(集团BigBlockViewController是我班)什么工作:
Group *workAround = bigBlockViewController.selectedGroup;
[picker dismissModalViewControllerAnimated:YES];
bigBlockViewController.selectedGroup = workaround;
我的照片选择器从flipsideViewController
感谢执行,这是非常有益的。 – Alfonsol 2009-07-23 05:15:39