iOS: почему этот View Controller не помещается в стек Navigation Controller? - PullRequest
0 голосов
/ 05 июля 2011

У меня есть модальное представление, которое является контроллером навигации.При касании одной из строк в его 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];
}

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Я собираюсь сделать снимок в этом.

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

Я родом из Java, но знаю небольшую цель - c. Я думал, что вы не можете сравнивать строки с ==, что означало бы, что ваш контроллер представления никогда не создавался. Может быть, попробуйте метод isEqualToString.

Это моя единственная мысль, я могу ошибаться. Но удачи.

0 голосов
/ 05 июля 2011

Немного сна помогло мне найти проблему.На самом деле их было два:

1) Последняя строка в AddItemDelegate гласила:

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

Однако _addItemNavController - это навигацияконтроллер, поэтому часть '.navigationController' необходимо было удалить.

2) Мне также нужно было назначить tc.addItemDelegate для себя в showAddItemViewController.

0 голосов
/ 05 июля 2011

Оператор '==' не является хорошим способом сравнения строк, но в любом случае ваш код должен попадать в другую часть.По поводу вашего вопроса _addItemNavController должен быть равен нулю, потому что ваш NSLog печатает 0 для своего счетчика сохраняемых значений.Метод - (void) showAddItemViewController: (UIViewController *) viewController где-то вызывается?Ваш контроллер представления не инициализирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...