2016-11-20 3 views
0

У меня есть вид таблицы и этот метод, чтобы найти indexPath из подвида одного из своих клеток ...indexPathForCell: возвращение ноля

- (NSIndexPath *)indexPathContainingView:(UIView *)view { 
    while (view && ![view isKindOfClass:[UITableViewCell self]]) { 
     view = view.superview; 
    } 
    UITableViewCell *cell = (UITableViewCell *)view; 
    return (cell)? [self.tableView indexPathForCell:cell] : nil; 
} 

я называю с подвид из верхней ячейки (который видно, как таблица имеет не прокручивается), и, с точкой останова на return линии, я получаю этот запутанный результат в lldb ...

enter image description here

cell выглядит хорошо. Табличный вид ячейки соответствует моему tableView (есть промежуточный UITableViewWrapperView как прямой просмотр). Но посмотрите, как indexPathForCell: возвращает нуль? Я уверен, что ячейка видна.

Я не думаю, что это имеет значение, но подзаголовок cell Я начинаю с UICollectionView, и я вызываю это в методах источников данных коллекции.

Любые идеи?

EDIT более контекст ...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 

    // do stuff to setup the cell 
    // now reload the collection view that it contains 
    UICollectionView *collectionView = (UICollectionView *)[cell viewWithTag:33]; 
    [collectionView reloadData]; 

    return cell; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    NSIndexPath *indexPath = [self indexPathContainingView:collectionView]; 
    return // get my model from the index path and return the count of an array it contains 
    // but here's the problem. index path is nil here 
} 
+1

Является ли ячейка в настоящее время видимой в виде таблицы? Вы видите только путь индекса, если ячейка видна. – rmaddy

+0

Кто вызывает 'indexPathContainingView' и когда? – shallowThought

+0

@rmaddy - да, ячейка является первой ячейкой в ​​нераскрытой таблице. – user1272965

ответ

1

Предполагая, что вы используете раскадровки, и если вы готовы изменить подход вы используете возможное решение было бы (и более чистое решение, на мой взгляд) :

Перетащите розетку UICollectionView внутри вашей ячейки в UITableViewCell. В своем раскадровке снова установите delegate и dataSource из UICollectionView в свой класс, перетаскивая розетку. Конечно, вам придется использовать пользовательский UITableViewCell

В вашем cellForRowAtIndexPath для UITableView установить тег в UICollectionView быть вашим indexPath.row. Теперь в вашем numberOfItemsInSection вы можете получить доступ к свойству тега UICollectionView, и он будет содержать indexPath.row из UITableViewCell, к которому вы пытаетесь получить доступ, и, следовательно, вы можете получить доступ к своей модели.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 

    // do stuff to setup the cell 
    // now reload the collection view that it contains 
    cell.collectionView.tag = indexPath.row; 
    [cell.collectionView reloadData]; 
    return cell; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 

// get my model from the index path and return the count of an array it contains 
    Model *model = dataArray[collectionView.tag]; 

    return model.count; 

} 
+0

Спасибо, я понимаю. Можете ли вы предложить причину, почему мой подход не работает? Если бы мой подход работал, я думаю, что это было бы лучше, чем это предложение (насколько я ценю вашу помощь !!), потому что ваша идея зависит от пользовательского класса для ячейки и (что еще более важно) от типа злоупотребления свойством tag что-то другое. Подумайте, если бы у меня также были секции в таблице, я бы замаскировал целое число тегов в раздел и строку? – user1272965

+0

Но я ценю мысль. Я мог бы застрять в этом, если не смогу понять это. Я, конечно же, пожелал, чтобы @rmaddy мог дать некоторую перспективу здесь. – user1272965

+0

Ну, вы могли бы просто сделать это, подклассифицируя 'UICollectionView', чтобы содержать два свойства для передачи раздела и строки. Конечно, я посмотрю! У меня были некоторые вопросы о вашем подходе: D. В первой строке вашего 'indexPathContainingView'. вы написали '[UITableViewCell self]' и не должны ли это '[UITableViewCell class]'? А также проверить, что выглядит 'view.superView'? Разве это не будет «contentView» ячейки, а не сама ячейка? Попробуйте использовать 'view.superView.superView'! – Rikh

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