我有一个奇怪的问题,UIPopovercontroller在加载弹出窗口后立即释放其内容视图控制器,然后重新初始化它。
我的目标是在popover被解雇时阅读textField。Popover在初始化后直接释放内容视图控制器
我的印象是我创建了一个UIViewController并将其设置为popover的内容视图控制器。 PopoverViewController将保留内容视图控制器,我可以(自动)释放它。
稍后,在弹出窗口被解除时,它将释放弹出窗口(并将其与内容视图控制器一起)。但这不起作用。这是我的相关代码:
- (IBAction)popoverButton:(id)sender {
// Create & Initialize content view controller
ContentViewController* cvc = [[[ContentViewController alloc] initWithNibName:@"ContentViewController" bundle:nil] autorelease];
// Create, initialize and load popover
popoverController = [[UIPopoverController alloc] initWithContentViewController:cvc];
[popoverController setDelegate:self];
[popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
NSLog(@"popoverButton: %@, retainCount: %d", cvc, [cvc retainCount]);
}
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)senderPopoverController
{
NSLog(@"popover should dismiss");
ContentViewController *dvc = (ContentViewController *)([popoverController contentViewController]);
NSLog(@"%@ %@ %@", dvc, [dvc testTextfield], [[[dvc testTextfield] text] description]);
return YES;
}
ContentViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
[[self testTextfield] setText:@"Bla"];
NSLog(@"viewDidLoad: %@", testTextfield);
}
- (void)dealloc {
NSLog(@"dealloc: %@", testTextfield);
[testTextfield release];
[super dealloc];
}
当我打开酥料饼,日志将(我认为的输出顺序并不当它代表的顺序实际上是调用):
Popover Test[2363:707] viewDidLoad: <UITextField: 0x185750; ...>
Popover Test[2363:707] viewDidLoad: (null)
Popover Test[2363:707] popoverButton: <ContentViewController: 0x1844e0>, retainCount: 4
Popover Test[2363:707] dealloc: <UITextField: 0x185750; ...>
当我关闭它:
Popover Test[2363:707] popover should dismiss
Popover Test[2363:707] <ContentViewController: 0x1844e0> (null) (null)
Popover Test[2363:707] popover did dismiss
Popover Test[2363:707] <UIPopoverController: 0x184860>
Popover Test[2363:707] dealloc: (null)
所以我的问题是:
- 为什么ContentViewController释放和初始化的第二次?
- 为什么网点(textField)在第二次加载时不再工作?
如果我能解决这个问题,我将能够从文本字段中popoverControllershouldDismissPopover阅读
感谢您的回复。我为所有的init方法实现了一个跟踪,实际上它只是初始化一次。 initWithNibName调用initWithCoder。多数民众赞成它,然后它被释放,我仍然无法弄清楚为什么。
我只是想用retainCount进行跟踪,它不可靠? – michaelk 2012-01-31 19:44:25
我不确定我是否正确理解您的答案。我的ContentViewController存储在一个单独的nib文件中。第一次加载的时候是我调用initWithNibFile的时候:或者我错了?那么第二次什么时候? – michaelk 2012-01-31 23:04:20
对不起 - 我想我可能误解了你的评论。你确定它正在初始化两次吗? – bbum 2012-02-01 06:55:07