iOS:为什么这个View Controller没有被推到导航控制器的堆栈上?

时间:2011-07-05 01:11:24

标签: iphone ios ipad memory-management uinavigationcontroller

我有一个模态视图,它是一个导航控制器。当其UITableView中的一行被轻击时,应该初始化该行的正确视图控制器并将其推送到导航控制器的堆栈(以便屏幕现在显示该视图控制器)。但它不起作用。我一直试图调试它一段时间,看起来导航控制器的保留计数在调用pushViewController时为0。我认为这意味着它已被解除分配,并且这是问题的根源。但我无法弄清楚原因。

在以下代码中,AddSportDelegate.m显示模式视图,其中包含使用必要的(_addItemNavController)初始化的必要导航控制器AddItemTableViewController。点击由AddItemViewController管理的表视图的其中一行会调用showAddItemDataView: AddSportDelegate方法,而_addItemNavController方法应将正确的ViewController推送到_addItemNavController堆栈。但是,正如我在代码中的注释中所述,此时UILabel的保留计数为0。

注意:我意识到这段代码有内存泄漏。为简洁起见,我删除了一些释放线。我还没有包含应该被推送的视图控制器的代码,因为它目前没有任何东西超出@synthesize addItemNavController = _addItemNavController; - (void)showAddItemViewController:(UIViewController *)viewController { _parentVC = viewController; [_parentVC retain]; tc = [[AddItemTableViewController alloc] init]; UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonSystemItemDone target:self action:@selector(cancelAdd)]; tc.navigationItem.leftBarButtonItem = cancelButton; tc.title = @"Select a Category"; _addItemNavController = [[AddItemNavController alloc] initWithRootViewController:tc]; tc.superViewController = _addItemNavController; [_parentVC.navigationController presentModalViewController:_addItemNavController animated:YES]; } - (void)showAddItemDataView:(SportCategory *)category { [category retain]; UIViewController *vc; if (category.name == @"Soccer") { vc = [[AddSoccerDataViewController alloc] init]; }else{ vc = [[AddBaseballDataViewController alloc] init]; } //retain count already 0 NSLog(@"retain count: %i", [_addItemNavController retainCount]); [_addItemNavController.navigationController pushViewController:vc animated:YES]; } 标识它是正确的视图控制器。

AddItemDelegate.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    _addItemDelegate = [[AddItemDelegate alloc] init];

    SportCategory *soccer = [[SportCategory alloc] initWithCategoryName:@"Soccer"];
    SportCategory *baseball = [[SportCategory alloc] initWithCategoryName:@"Baseball"];

    _categories = [[NSArray alloc] initWithObjects:soccer,baseball,nil];

    [self.tableView reloadData];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SportCategory *selectedCategory = [_categories objectAtIndex:[indexPath row]];
    [_addItemDelegate showAddItemDataView:selectedCategory];
}

AddItemTableViewController.m

{{1}}

3 个答案:

答案 0 :(得分:1)

我打算对此进行拍摄。

if (category.name == @"Soccer")

我来自java背景,但我知道一点目标 - c。我以为你无法将字符串与==进行比较,这意味着您的视图控制器从未创建过。也许尝试一个isEqualToString方法。

这是我唯一的想法,我可能是错的。但最好的运气。

答案 1 :(得分:0)

'=='运算符不是比较字符串的好方法,但无论如何你的代码应该落入else部分。 关于您的问题,_addItemNavController必须为nil,因为您的NSLog为其保留计数打印0。 是方法 - (void)showAddItemViewController :( UIViewController *)viewController在某处调用? 您的视图控制器似乎未初始化。

答案 2 :(得分:0)

一点睡眠帮我找到了问题。实际上有两个:

1)AddItemDelegate中的最后一行读取:

[_ addItemNavController.navigationController pushViewController:vc animated:YES];

但是,_addItemNavController是导航控制器,因此需要删除'.navigationController'部分。

2)我还需要在showAddItemViewController中将tc.addItemDelegate分配给self。

相关问题