У меня есть модальное представление, которое является контроллером навигации.При касании одной из строк в его UITableView правильный инициализатор View для этой строки должен быть инициализирован и помещен в стек контроллера навигации (чтобы на экране теперь отображался этот View Controller).Но это не работает.Я пытался отладить его некоторое время, и кажется, что счетчик сохранения контроллера навигации равен 0 во время вызова pushViewController
.Я предполагаю, что это означает, что это было освобождено, и это - корень проблемы.Но я не могу понять, почему.
В следующем коде AddSportDelegate.m
представляет модальное представление, которое содержит необходимый навигационный контроллер (_addItemNavController)
, инициализированный с необходимым AddItemTableViewController
.Нажатие на одну из строк табличного представления, управляемого AddItemViewController
, вызывает метод showAddItemDataView:
для AddSportDelegate
, который, в свою очередь, должен поместить правильный ViewController в стек _addItemNavController
.Но, как я отмечаю в комментарии к коду, количество сохраненных значений _addItemNavController
в этот момент равно 0.
Примечание. Я понимаю, что этот код имеет утечки памяти.Ради краткости я удалил несколько строк релиза.Я также не включил код для контроллера представления, который должен выдвигаться, поскольку на данный момент у него нет ничего, кроме UILabel
, указывающего, что это правильный контроллер представления.
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];
}