UITableView Cell IndexPath

Может ли кто-нибудь сказать мне, как я могу получить IndexPath ячейки? Я сохранял IndexPath в методе tableView: cellForRowAtIndexPath:, но он загружается только при просмотре ячейки, и мне нужно знать путь ее индекса в методе viewDidLoad. это привело к нулевому значению, потому что, как я уже сказал, оно загружает свое значение только после того, как ячейка была просмотрена один раз.

Спасибо.

РЕДАКТИРОВАТЬ

Намерение состоит в том, чтобы иметь возможность перейти к определенной ячейке, которая имеет свой определенный номер, но не является линейной с количеством разделов и строк.


person Leonardo Marques    schedule 30.03.2010    source источник
comment
зачем вам indexPath в методе viewDidLoad?   -  person Hua-Ying    schedule 30.03.2010
comment
потому что мне нужно перейти к определенной позиции ячейки на моем столе, и я не знаю, в какой позиции она будет.   -  person Leonardo Marques    schedule 31.03.2010
comment
Я смущен. Как разделы и количество строк для определенного элемента данных в таблице не являются линейными? Если это не линейно, как отображается линейная таблица?   -  person Giao    schedule 31.03.2010
comment
например, у каждой ячейки данных есть связанный с ней номер, который идет от 0 до 9, но будет 3 раздела, где первый имеет 3 элемента, второй 6 и третий 1, автобус это распределение может варьироваться, и оно задается индексным путем ячейки . поэтому я знаю, что моя ячейка будет номер 9, но мне нужно перейти на [2,5]. Надеюсь, это сделало то, что я имел в виду. Спасибо.   -  person Leonardo Marques    schedule 31.03.2010


Ответы (4)


Используйте метод indexPathForCell: в tableView при наличии указателя на UITableViewCell он возвращает свой indexPath.

Вы можете поместить scrollToRowAtIndexPath:atScrollPosition:animated: в метод viewWillAppear, если он еще не настроен в viewDidLoad. В любом случае это лучше, если представление может появляться более одного раза после загрузки, например, когда модальный контроллер представления, который он вызывает, уходит в отставку.

person progrmr    schedule 01.04.2010
comment
Проблема в том, что ячейка может использоваться повторно, и она не видна и не создается до того, как вызывается tableView:cellForRowAtIndexPath:, поэтому у меня нет ссылки на ячейку. Поскольку я вызываю строку номер 0 из раздела 5, я создаю IndexPath и использую его в scrollToRowAtIndexPath:atScrollPosition:animated: Я застрял с этим уродливым решением, поэтому, если у вас есть идея получше, поделитесь ею. - person Leonardo Marques; 01.04.2010
comment
Ну, если вы не знаете, к какой ячейке вы хотите прокрутить, и не знаете, к какому пути индекса (строке/разделу) вы хотите прокрутить, похоже, вы не можете этого сделать. Это может быть неприменимо, но в моем случае у меня есть все ячейки в NSArray, поэтому я могу прокрутить до любой ячейки, но тогда я также не использую их повторно. - person progrmr; 02.04.2010
comment
Спасибо за ваше терпение - person Leonardo Marques; 02.04.2010

UITableViewCell не имеет свойства NSIndexPath. Делегат UITableViewDataSource определяет методы, которые запрашивают ячейку для данного NSIndexPath, но это не означает, что ячейка имеет какое-либо устойчивое отношение к свойству NSIndexPath.

Может быть, было бы полезно, если бы вы объяснили, для чего вам нужна эта недвижимость? Что вы хотите сделать с расположением ячейки в viewDidLoad?

person pkananen    schedule 30.03.2010
comment
Я хочу иметь возможность перейти к этой конкретной ячейке с помощью scrollToRowAtIndexPath:atScrollPosition:animated: at, кажется, это правильный способ сделать это. - person Leonardo Marques; 31.03.2010
comment
Хорошо, тогда создайте переменную NSIndexPath и создайте копию для вашего использования, чтобы вы могли вызывать этот метод в будущем. - person pkananen; 31.03.2010
comment
Вот что у меня есть. Проблема в том, что переменная создается только при создании ячейки, и если ячейка не видна в начале, она не создается, и это значение равно нулю. - person Leonardo Marques; 31.03.2010
comment
Почему переменная indexpath создается только при создании ячейки? Почему вы не можете создать его экземпляр в контроллере представления, где вы собираетесь выдать scrollTo? - person progrmr; 02.04.2010
comment
Спасибо за ваше терпение - person Leonardo Marques; 02.04.2010

Попробуй это..

    NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:EventlistTable_obj];
NSIndexPath *indexPath = [EventlistTable_obj indexPathForRowAtPoint: currentTouchPosition];
 NSLog(@"Selected  row:%d in section:%d",indexPath.row,indexPath.section);

Звоните так:

[cell.fourth_image_button addTarget:self action:@selector(Btn_pressed:event:) forControlEvents:UIControlEventTouchUpInside];
person Gaurav    schedule 03.05.2011

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

РЕДАКТИРОВАТЬ: Хорошо, я думаю, я понимаю, что вы хотите: вы где-то сохраняете indexPath, когда передаете ячейку в tableView. Примечание: если вы этого не сделаете, вы никак не сможете узнать, в каком indexPath находится конкретная ячейка, по крайней мере, если вы делаете все так, как должны.

Итак, что вы можете сделать, так это просто создать все ячейки в вашем методе viewDidLoad, сохранить их в массиве, а затем, когда табличное представление запросит их, просто передать их из этого массива.

Обратите внимание, что это не лучший способ заполнения табличного представления, поскольку он предотвращает повторное использование ячеек. Лучшим способом было бы сохранить содержимое ячеек (обычные UIViews) в массиве и добавить их в качестве дочерних элементов в представление содержимого ячейки перед возвратом ячейки. Это позволило бы повторно использовать ячейки, что имеет решающее значение для хорошей производительности. Если у вас не больше ячеек, чем помещается на экране, вам не нужно беспокоиться об их повторном использовании.

person Felixyz    schedule 30.03.2010
comment
Часть вашего ответа не соответствует действительности. В более позднее время после сохранения IndexPath конкретной ячейки я все еще могу использовать его IndexPath, поскольку на него ссылаются в другом месте. - person Leonardo Marques; 31.03.2010
comment
Хорошо, возможно, вы не знакомы с тем, что происходит. Когда я сохраняю ячейку IndexPath, она всегда будет одним и тем же значением, даже если ячейка является экземпляром или нет. Он рассчитывается с учетом количества строк в разделе и количества разделов os, которые мне дает e tableView:cellForRowAtIndexPath: и когда я нахожу нужные ячейки, я сохраняю только их позицию, я не собираюсь хранить все ячеек, потому что их слишком много. Может быть, лучшим подходом будет прокрутить все вниз, сохранив все IP-адреса, а затем все вверх на viewDidLoad? Что вы думаете. Спасибо. - person Leonardo Marques; 31.03.2010
comment
@Reonarudo: Что вы имеете в виду, говоря, что сохраняете indexPath ячейки? Что происходит, так это то, что табличное представление просит вас предоставить ячейку для этого конкретного пути индекса. В самой ячейке нет заданного свойства, по крайней мере, ни одно из них, к которому вы должны получить доступ. когда я нахожу нужные мне ячейки, я сохраняю только их положение — что это значит? Где вы их найдете и где вы хотите их хранить. Обязательно прочитайте и усвойте документацию для -(UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier, чтобы понять, почему то, что вы делаете, не является хорошей идеей. - person Felixyz; 31.03.2010
comment
Когда я извлекаю содержимое ячейки для каждого IndexPath, я проверяю, содержит ли он номер X, если это так, то я хочу сохранить его позицию в таблице, заданную текущим IndexPath, все содержимое ячейки хранится в базе данных coredata. Это делается для того, чтобы я мог автоматически прокручивать до этой конкретной позиции, когда я нажимаю кнопку. Может быть, вы знаете лучший способ сделать это? - person Leonardo Marques; 31.03.2010
comment
@Reonarudo: я считаю, что ответ kk6yb в значительной степени охватывает это. - person Felixyz; 02.04.2010
comment
Спасибо за ваше терпение - person Leonardo Marques; 02.04.2010