indexPathForSelectedRow на предыдущих UITableViews всегда возвращает ноль? - PullRequest
1 голос
/ 22 августа 2009

У меня есть стек UITableView, управляемый UINavigationController. Когда я пытаюсь вызвать indexPathForSelectedRow для любого из предыдущих UITableView, я всегда получаю nil:

NSEnumerator *e = [[navigationController viewControllers] objectEnumerator];
UITableViewController *controller;
while (controller = [e nextObject]) {
    NSIndexPath *selectedIndexPath = [[controller tableView] indexPathForSelectedRow]; // always nil
    // ...
}

Я не могу найти ничего об этом поведении в документах Apple; это намеренно? Если так, есть ли другой способ сделать то, что я пытаюсь сделать, без необходимости прибегать к ручному управлению избыточной переменной экземпляра mySelectedIndexPath внутри didSelectRowAtIndexPath или что-нибудь подобное?

Ответы [ 2 ]

1 голос
/ 29 ноября 2010

Я заметил это и на iPad, в режиме разделенного экрана (слева, справа, на панели подробностей), и это немного раздражает. Однако я обнаружил, что если вы переопределите viewWillAppear, вы можете получить выбранную строку для табличного представления до , которую вы вызываете [super viewWillAppear];

Так что если бы у вас был такой код, indexPathForSelectedRow был бы равен нулю,

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if(![_self.tableView indexPathForSelectedRow])
    {
        NSLog(@"nothing selected, so selecting 1st one");
            // sets the detail pane here. 
    }
}

но если бы код был таким (обратите внимание на viewWillAppear: в конце), то indexPathForSelectedRow не будет nil.

- (void)viewWillAppear:(BOOL)animated {
    if(![_self.tableView indexPathForSelectedRow])
    {
        NSLog(@"nothing selected, so selecting 1st one");
                // sets the detail pane here. 
    }
    [super viewWillAppear:animated];
}
1 голос
/ 23 августа 2009

Невидимое представление в стеке UINavigationController может быть выгружено в любое время, поэтому вы не можете полагаться на состояние невидимых представлений.

Вполне возможно, что UITableViewController, на который вы ссылаетесь, уже выгрузил свое табличное представление, в этом случае вызов [controller tableView] создаст новое представление.

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