Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c presentViewController:animated:completion:始终会生成所显示视图控制器的两个实例,这是一个bug吗?_Objective C_Ios_Modalviewcontroller - Fatal编程技术网

Objective c presentViewController:animated:completion:始终会生成所显示视图控制器的两个实例,这是一个bug吗?

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

我连接到显示的视图控制器的init、loadView、viewDidLoad、ViewWillAspect:、ViewDidAspect:、viewDidUnload和dealloc方法,以注销相关的计时信息

但我们发现无论是
presentModalViewController:animated:
还是
presentViewController:animated:completion:
都会导致显示的视图控制器的两个实例,其中一个实例很快就会被销毁,屏幕上不会出现任何内容(loadView和next方法尚未启动)

这是一个bug还是iOS的视图控制器转换就是这样工作的

以下是日志信息,WDIMminItemEditViewController是显示视图控制器,WDIMminInscreenViewController是显示视图控制器:

2012-09-29 16:10:02.615 ideaCal[23450:707]:编辑视图控制器将初始化

2012-09-29 16:10:02.639 ideaCal[23450:707]:编辑视图控制器已初始化

2012-09-29 16:10:02.641 ideaCal[23450:707]:编辑视图控制器将初始化

2012-09-29 16:10:02.645 ideaCal[23450:707]:编辑视图控制器已初始化

2012-09-29 16:10:02.835 ideaCal[23450:707]将显示模式视图控制器:

2012-09-29 16:10:02.841 ideaCal[23450:707]:编辑视图控制器负载视图

2012-09-29 16:10:02.910 ideaCal[23450:707]:编辑 视图控制器已加载视图

2012-09-29 16:10:02.912 ideaCal[23450:707]:编辑视图控制器的视图将出现

2012-09-29 16:10:03.297 ideaCal[23450:707]将显示模式视图控制器:

2012-09-29 16:10:03.302 ideaCal[23450:707]:编辑视图控制器将解除锁定

2012-09-29 16:10:03.340 ideaCal[23450:707]:编辑视图控制器结束解除锁定

2012-09-29 16:10:03.702 ideaCal[23450:707]:出现编辑视图控制器的视图

2012-09-29 16:10:05.434 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
。谢谢!问题解决了!你的逻辑比我的严格,不客气。我已经添加了我的评论作为正式答案,你可以通过点击答案左边的复选框来“接受”它。这将从“未回答问题”列表中删除此问题。非常感谢。