我正在写一个iPhone应用程序。从导航堆栈中的视图控制器[称为EditCreatorController]开始,我提出了一个自定义模态视图控制器[称为BMSStringPickerController]。我根据Apple指南创建了一个委托协议等,用于将数据传递回第一个视图并使用该视图来关闭模态视图。我甚至从模态控制器获得了预期的数据,并且能够将其解雇。问题是,在这一点上,几乎我对原始视图控制器采取的任何操作都会导致调试器错误,如
- [EditCreatorController performSelector:withObject:withObject:]:消息发送到解除分配的实例0x3a647f0
或
- [EditCreatorController tableView:willSelectRowAtIndexPath:]:发送到解除分配的实例0x3c12c40的消息
换句话说,在显示模态视图时,原始视图控制器似乎已经蒸发。无论调用哪两个委托回调,都是如此。
以下是调用模态视图的父控制器的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 1) { // selection on creator type row
// create a string picker to choose new creator type from list
BMSStringPickerController *picker = [[BMSStringPickerController alloc] initWithNibName:@"BMSStringPickerController" bundle:nil];
picker.delegate = self;
picker.stringChoices = [NSArray arrayWithObjects:@"composer", @"lyricist", @"arranger", @"original artist", @"other", nil];
picker.currentChoice = creator.type;
picker.title = @"Creator Type";
// wrap it in a nav controller so we can get tile bar etc. (from VC prog guide p. 93)
UINavigationController *newNavigationController = [[UINavigationController alloc]
initWithRootViewController:picker];
[self.navigationController presentModalViewController:newNavigationController animated:YES];
[newNavigationController release];
[picker release];
}
}
以下是委托回调:
- (void)stringPickerController:(BMSStringPickerController *)picker didPickString:(NSString *)string {
NSLog(@"received string back: %@", string);
typeLabel.text = string; // only change the label for now; object only changes if done button pressed
[self.tableView reloadData];
[self dismissModalViewControllerAnimated:YES];
}
- (void)stringPickerControllerDidCancel:(BMSStringPickerController *)picker {
NSLog(@"picker cancelled");
[self dismissModalViewControllerAnimated:YES];
}
另一个奇怪的事情(也许是一个线索)是,虽然我得到了“收到的字符串”NSLog消息,并将其分配给typeLabel.text(typeLabel是我的表视图中的标签的IBOutlet),但它从未出现过,即使表重新加载。
任何人都有一些想法?
答案 0 :(得分:2)
也许您在delegate
的{{1}}中发布了dealloc
?
答案 1 :(得分:1)
它可能无法解决您的问题,但我建议告诉选择器解雇自己(在委托方法中),允许响应者链正确处理解雇:
[picker dismissModalViewControllerAnimated:YES];
答案 2 :(得分:1)
存在内存警告时的默认行为是释放所有不可见的视图控制器的视图。因此,如果在模态视图控制器中存在内存警告,则其父视图控制器可以卸载其视图。
发生这种情况时,会在视图控制器上调用viewDidUnload,以便您可以释放您在视图中保留的任何引用。如果您有未保留的引用,则在卸载视图时它们将变为无效。也许这种情况发生在你的情况下?
有关详细信息,请参阅UIViewController reference Memory Management部分。如果视图当前不可见,则UIViewController方法didReceiveMemoryWarning:将释放视图,然后调用viewDidUnload。