我有一个奇怪的问题,UIPopovercontroller在加载弹出窗口后立即释放其内容视图控制器,然后重新初始化它。
我的目标是在解除弹出窗口时读取textField。
我的印象是我创建了一个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时,Log会是(我认为输出的顺序并不代表实际调用时的顺序):
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)
所以我的问题是:
如果我能解决这个问题,我可以在 popoverControllershouldDismissPopover
中的textField中读取答案 0 :(得分:1)
由于ContentViewController
是您的类,因此请实施相应的init*
方法(如果您还没有),设置一个断点,调试器将在每次分配时停止,并将您的问题回答为为什么要重建它。
请注意retainCount
没用;不要叫它。
啊 - 好的 - 所以,当你在代码中直接加载nib文件和第二个实例时,你正在创建一个实例。相反,您需要一个连接到nib文件中实例的插座。
至于retainCount; Calling -retainCount Considered Harmful和When to use -retainCount?