我正在创建UIPopoverController
并将“Editor1”设置为内容视图控制器。
当调用者收到didDismissPopover时,我将释放UIPopoverController
。
这是代码:
- (IBAction)open1:(id)sender {
Editor1 *editor = [[Editor1 alloc] initWithNibName:@"Editor1" bundle:nil];
_popoverController = [[UIPopoverController alloc] initWithContentViewController:editor];
_popoverController.delegate = self;
[editor release];
[self.popOverController presentPopoverFromRect:self.open1Button.bounds inView:self.open1Button permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
}
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController{
NSLog(@"popoverControllerShouldDismissPopover");
return YES;
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{
NSLog(@"popvoerControllerDidDismissPopover");
[_popoverController release];
}
在我的编辑器中,我有一个UITextField
用户更改文本,当我收到消息“editingDidEnd”时保存它
- (IBAction)editingDidEnd:(id)sender {
NSLog(@"Editing did End");
// SAVE PROCEDURE
}
我的问题是调用方法的顺序。 订单是:
2011-09-07 12:35:21.628 iosTest[1967:b603] popoverControllerShouldDismissPopover
2011-09-07 12:35:21.629 iosTest[1967:b603] popvoerControllerDidDismissPopover
2011-09-07 12:35:21.983 iosTest[1967:b603] Editing did End
2011-09-07 12:35:21.985 iosTest[1967:b603] viewWill Disappear
正如您所看到的,在editingDidEnd:
之前调用popoverControllerDidDismissPopover,这意味着我在执行保存过程之前释放了弹出窗口。这可能会给我带来崩溃问题。
另外,在我的保存程序中,我需要在某些情况下要求用户确认。我正在使用UIAlertView
。
你有什么建议吗?
答案 0 :(得分:0)
_popoverController
是实例属性。在这种情况下,您可以在父控制器的viewDidUnload
方法中释放它。
答案 1 :(得分:0)
为什么不使用UITextFieldDelegate
协议?用法:
aTextField.delegate = self;
(...)
- (void)textFieldDidEndEditing:(UITextField *)textField {
NSLog(@"Editing did End");
// SAVE PROCEDURE
}
阅读the documentation了解详情。
答案 2 :(得分:0)
通常视图表现良好,不会在屏幕外发送事件。您可以通过启用僵尸来检查潜在的问题(设置环境变量NSZombieEnabled = YES)。
如果发生崩溃,正确的修复位置在-[Editor1 dealloc]
(可能是-viewDidUnload
):只需执行textField.delegate = nil
即可停止接收回调。这通常不是必需的,除了Web视图和滚动视图,它似乎有问题(即使VC在屏幕外,滚动动画也会继续)。
在您的情况下,您可以在-popoverControllerShouldDismissPopover:
中进行保存,如果您需要显示UIAlertView(并在按下按钮时取消弹出框),则返回NO。