Objective c presentViewController:animated:completion:始终会生成所显示视图控制器的两个实例,这是一个bug吗?
我连接到显示的视图控制器的init、loadView、viewDidLoad、ViewWillAspect:、ViewDidAspect:、viewDidUnload和dealloc方法,以注销相关的计时信息 但我们发现无论是Objective c presentViewController:animated:completion:始终会生成所显示视图控制器的两个实例,这是一个bug吗?,objective-c,ios,modalviewcontroller,Objective C,Ios,Modalviewcontroller,我连接到显示的视图控制器的init、loadView、viewDidLoad、ViewWillAspect:、ViewDidAspect:、viewDidUnload和dealloc方法,以注销相关的计时信息 但我们发现无论是presentModalViewController:animated:还是presentViewController:animated:completion:都会导致显示的视图控制器的两个实例,其中一个实例很快就会被销毁,屏幕上不会出现任何内容(loadView和next
presentModalViewController:animated:
还是presentViewController:animated:completion:
都会导致显示的视图控制器的两个实例,其中一个实例很快就会被销毁,屏幕上不会出现任何内容(loadView和next方法尚未启动)
这是一个bug还是iOS的视图控制器转换就是这样工作的
以下是日志信息,WDIMminItemEditViewController是显示视图控制器,WDIMminInscreenViewController是显示视图控制器:
2012-09-29 16:10:02.615 ideaCal[23450:707]- (IBAction)slidingMenuGetPressed:(WZUICircularPagingControlViewSlidingMenu *)slidingMenu event:(UIEvent *)event
{
WDIMEditViewController * editModalViewController = nil;
if ([slidingMenu.identifier isEqualToString:NEW_MIND_ITEM]) {
editModalViewController = [[WDIMMindItemEditViewController alloc] init];
}
if ([slidingMenu.identifier isEqualToString:NEW_PROJECT]) {
editModalViewController = [[WDIMMindItemEditViewController alloc] init];
}
if ([slidingMenu.identifier isEqualToString:NEW_TAG]) {
editModalViewController = [[WDIMTagEditViewController alloc] init];
}
dispatch_queue_t snapshotQueue = dispatch_queue_create("com.WeZZardDesign.ScreenSnapshotQueue", NULL);
dispatch_async(snapshotQueue, ^{
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
editModalViewController.backgroundImage = snapshot;
NSManagedObjectContext * workingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workingContext.parentContext = self.database.managedObjectContext;
editModalViewController.preference = self.preference;
editModalViewController.dataSource = self;
editModalViewController.delegate = self;
editModalViewController.workingContext = workingContext;
NSLog(@"%@ will present modal view controller: %@", self, editModalViewController);
[self presentViewController:editModalViewController animated:YES completion:^{
NSLog(@"%@ ended present modal view controller: %@", self, editModalViewController);
}];
});
});
dispatch_release(snapshotQueue);
}
我在
presentModalViewController:animated:
和presentViewController:animated:completion:
方法中没有任何改变。从上面的评论中可以清楚地看出,NEW\u MIND\u ITEM
和NEW\u PROJECT
是两个具有相同内容的字符串。由于isEqualToString
比较的是内容,而不是指针,因此会执行两个“if”块,从而创建wdimInditemEditViewController
的两个实例。使用不同的字符串可以解决此问题。看起来好像在滑动菜单中初始化了wdimmInditeEditViewController
的两个实例。是否NEW\u MIND\u ITEM
和NEW\u PROJECT
是相同的字符串?在这种情况下,将执行两个“if”块。是的,NEW_MIND_ITEM
和NEW_PROJECT
是相同的字符串,但它们不相同。不仅执行了wdimminitemeditviewcontroller
的两个实例,而且wdimmininscreenviewcontroller
向所有实例显示其中一个未调用完成块。真奇怪。我想我应该创建一个干净的项目来重建现状<代码>isEqualToString:
比较字符串内容,而不是指针。所以,如果NEW_MIND_ITEM和NEW_PROJECT是相同的字符串,那么将执行两个“if”块。您应该通过在调试器中设置断点来检查这一点。-2.“将显示模式视图控制器…”在NSLog输出中显示两次,这意味着已调用了两次slidingMenuGetPressed
。谢谢!问题解决了!你的逻辑比我的严格,不客气。我已经添加了我的评论作为正式答案,你可以通过点击答案左边的复选框来“接受”它。这将从“未回答问题”列表中删除此问题。非常感谢。