2012-01-30 52 views
0

我有一个奇怪的问题,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) 

所以我的问题是:

  1. 为什么ContentViewController释放和初始化的第二次?
  2. 为什么网点(textField)在第二次加载时不再工作?

如果我能解决这个问题,我将能够从文本字段中popoverControllershouldDismissPopover阅读

回答

1

由于ContentViewController是你的类中,实现适当的init*方法(如果你还没有的话),设置一个断点和调试器将停止在它的每个分配,回答你的问题,为什么它被重新创建。

请注意retainCount是无用的;别叫它。


好的 - 所以,当您在代码中直接加载nib文件和第二个实例时,您正在创建一个实例。相反,你需要一个连接到nib文件中的实例的插座。

至于retainCount; Calling -retainCount Considered HarmfulWhen to use -retainCount?

+0

感谢您的回复。我为所有的init方法实现了一个跟踪,实际上它只是初始化一次。 initWithNibName调用initWithCoder。多数民众赞成它,然后它被释放,我仍然无法弄清楚为什么。
我只是想用retainCount进行跟踪,它不可靠? – michaelk 2012-01-31 19:44:25

+0

我不确定我是否正确理解您的答案。我的ContentViewController存储在一个单独的nib文件中。第一次加载的时候是我调用initWithNibFile的时候:或者我错了?那么第二次什么时候? – michaelk 2012-01-31 23:04:20

+0

对不起 - 我想我可能误解了你的评论。你确定它正在初始化两次吗? – bbum 2012-02-01 06:55:07

相关问题