当我尝试在我的iPad应用程序中显示弹出控制器时,我得到(显然常见的)错误[UIPopoverController dealloc] reached while popover is still visible.
。
这里有很多问题,但我的问题似乎有所不同。首先,我通过父视图控制器上的属性维护对弹出控制器的强引用:
@property (strong, nonatomic) UIPopoverController* passcodePopover;
这是我的代码,它实际上呈现了popover(请注意我使用的是第三方BZPasscodeViewController):
- (IBAction)adminConfig:(id)sender {
self.passView = [[BZPasscodeViewController alloc] init];
self.passView.title = @"Kiosk Administration";
self.passView.text = @"Enter passcode:"; // TODO: localize
self.passView.handler = ^(NSString *enteredPasscode, NSString **text, NSString **detailText, BOOL *detailTextHighlighted) {
NSLog( @"password handler!" );
return BZPasscodeViewControllerResultDone;
};
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.passView];
self.passView.contentSizeForViewInPopover = [BZPasscodeViewController defaultContentSizeForView];
self.passView.modalInPopover = YES;
UIPopoverController* uipc = [[UIPopoverController alloc] initWithContentViewController:navigationController];
self.passcodePopover = uipc;
[self.passcodePopover bz_presentPopoverInWindow:self.view.window animated:YES];
}
现在奇怪的是,它似乎在调用 set 属性时崩溃,如此堆栈跟踪片段中所示:
0 CoreFoundation 0x01d2802e __exceptionPreprocess + 206
1 libobjc.A.dylib 0x01165e7e objc_exception_throw + 44
2 CoreFoundation 0x01d27deb +[NSException raise:format:] + 139
3 UIKit 0x00573bf2 -[UIPopoverController dealloc] + 86
4 libobjc.A.dylib 0x011799ff -[NSObject release] + 47
5 libobjc.A.dylib 0x011780d5 objc_release + 69
6 libobjc.A.dylib 0x01178fda objc_storeStrong + 39
7 Kiosk 0x00047d59 -[SplashViewController setPasscodePopover:] + 57
8 Kiosk 0x00047ad2 -[SplashViewController adminConfig:] + 802
...
然而,在应用程序崩溃之前,弹出窗口出现在模拟器中,所以它显然已经超过了当前的呼叫。显然有一些其他隐含的调用setPasscodePopover:
在某处发生。
如果它提供任何见解,则上述方法由手势识别器触发。
答案 0 :(得分:1)
self.passcodePopover
时, uipc
不是零。它已经指向屏幕上的弹出控制器。当您将uipc
分配给self.passcodePopover
时,会释放旧的popover控制器,然后在其视图仍然可见时取消分配。
你需要弄清楚你何时想要解雇旧的弹出窗口。你可以在重新分配之前简单地解雇它:
[self.passcodePopover dismissPopoverAnimated:YES];
self.passcodePopover = uipc;
请注意,将dismissPopoverAnimated:
发送到nil是安全的(它没有效果),因此您甚至不必先检查它。