我有一个模式视图,它是导航控制器。当点击其UITableView中的某一行时,应初始化该行的正确View Controller并将其推入Navigation Controller的堆栈中(以便屏幕现在显示该View Controller)。但这不起作用。我已经尝试调试了一段时间,看来在调用pushViewController时导航控制器的保留计数为0。我认为这意味着它已被释放,并且这是问题的根源。但我不知道为什么。

在下面的代码中,AddSportDelegate.m给出了模态视图,该视图包含使用必要的(_addItemNavController)初始化的必要的导航控制器AddItemTableViewController。点击AddItemViewController管理的表视图的某一行会调用showAddItemDataView:AddSportDelegate方法,这又会将正确的ViewController推入_addItemNavController堆栈。但是,正如我在代码注释中指出的那样,此时_addItemNavController的保留计数为0。

注意:我意识到这段代码存在内存泄漏。为了简洁起见,我删除了一些发布行。我也没有包含应该被推入的视图控制器的代码,因为除了UILabel,它目前没有任何东西可以识别出它是正确的View Controller。

AddItemDelegate.m

@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];
}


AddItemTableViewController.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];
}

最佳答案

我将对此进行拍摄。

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


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

那是我唯一的想法,我可能是错的。但是,祝你好运。

关于iphone - iOS:为什么不将这个View Controller插入Navigation Controller的堆栈中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6577209/

10-09 01:26