2009-08-22 2 views
1

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

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

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

+0

Это должно сработать. Может быть, navigationController не ссылается на правильный объект. Как вы получаете navigationContoller в представлениях, которые вы нажимаете на стек? – VoidPointer

ответ

1

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

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

+0

Интересно; Спасибо за информацию. Является ли это документированным где угодно? – 2009-08-23 11:01:41

+0

См. Раздел «Управление памятью» в документации UIViewController. – Darren

1

Я тоже замечал это на 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 не будет равна нулю.

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

Hackish, но он работает –

+0

Единственная причина, по которой это работает, заключается в том, что вы используете UITableViewController и по умолчанию для параметра cleararsSelectionOnViewWillAppear используется значение YES. Вы должны установить clearsSelectionOnViewWillAppear в НЕТ, а затем вы можете получить доступ к выбранной строке, но вы не боитесь, что UITableViewController отменит ее для вас. –

Смежные вопросы