0

我连接到呈现的视图控制器的 init、loadView、viewDidLoad、viewWillAppear:、viewDidAppear:、viewDidUnload 和 dealloc 方法以注销相关的时间信息。

但是发现是否presentModalViewController:animated:presentViewController:animated:completion:将导致呈现的视图控制器的两个实例,其中一个将很快被销毁,而屏幕上没有出现任何内容(尚未触发 loadView 和 next 方法)。

它是一个错误还是 iOS 的视图控制器转换就是这样工作的?

这是日志信息,WDIMMIndItemEditViewController 是呈现的视图控制器,WDIMMmainScreenViewController 是呈现的视图控制器:

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

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

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

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

2012-09-29 16:10:02.835 ideaCal[23450:707] < WDIMMmainScreenViewController: 0x27c790> 将呈现模态视图控制器:< WDIMMIndItemEditViewController: 0x2b5260>

2012-09-29 16:10:02.841 ideaCal[23450:707]<WDIMMindItemEditViewController:0x2b5260>:编辑视图控制器加载视图

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

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

2012-09-29 16:10:03.297 ideaCal[23450:707] < WDIMMmainScreenViewController: 0x27c790> 将呈现模态视图控制器:< WDIMMindItemEditViewController: 0x2b94d0>

2012-09-29 16:10:03.302 ideaCal[23450:707]<WDIMMindItemEditViewController:0x2b94d0>:编辑视图控制器将解除分配

2012-09-29 16:10:03.340 ideaCal[23450:707] <WDIMMindItemEditViewController: 0x2b94d0>:编辑视图控制器结束了释放

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

2012-09-29 16:10:05.434 ideaCal[23450:707] <WDIMMmainScreenViewController: 0x27c790> 结束当前模态视图控制器:<WDIMMindItemEditViewController: 0x2b5260>

这是我的演示代码:

- (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:

4

1 回答 1

0

从上面的评论中可以清楚地看出,NEW_MIND_ITEMandNEW_PROJECT是两个具有相同内容的字符串。由于 isEqualToString比较的是内容,而不是指针,因此执行了两个“if”块,创建了两个WDIMMindItemEditViewController. 使用不同的字符串应该可以解决问题。

于 2012-09-30T07:08:03.853 回答