2009-11-11 3 views
0

Я использую indexPath.row, чтобы определить, в какой строке моего табличного представления я что-то делаю. Название моих ячеек содержит число, которое должно быть 1 в первой строке и 18 в последней строке, поэтому у меня есть 18 строк. Это работает для первых 11 строк, но после этого у меня есть номера в заголовке, которые, похоже, генерируются случайным образом! Иногда 16, затем 5, затем 18, затем 12 ... и так далее. В чем проблема с этим/почему переменная indexPath.row ведет себя так?iPhone table view - проблема с indexPath.row

Мой метод cellForRowAtIndexPath:

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

static NSString *MyIdentifier = @"MyIdentifier"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"myCell" owner:self options:nil]; 
    cell = cell0; 
    self.cell0 = nil; 
} 
UILabel *label; 
label = (UILabel *)[cell viewWithTag:1]; 
label.text = [NSString stringWithFormat:@"Cell %d", indexPath.row]; 

return cell; 

}

Все больше предложений о том, как решить эту проблему? Я не получить его работы до сих пор ...

// Обновление с большим количеством кода:

Вот как я объявляю клетку. Он находится в файле XIB (шаблон «пустой XIB»), в котором я просто поместил ячейку из библиотеки в IB.

@interface myViewController : UITableViewController { 

    UITableViewCell *cell0; 
} 

@property (nonatomic, retain) IBOutlet UITableViewCell *cell0; 

Затем, в верхней части файла myViewController.m:

@synthesize cell0; 

Мой метод cellForRowAtIndexPath уже размещен выше. Он равен методу cellForRowAtIndexPath в документации SDK, и в примере Apple это работает.

+0

опубликовать вашу ячейкуForRowAtIndexPath: метод. – Morion

+0

Я добавил его в свой первый пост. – iYassin

+0

Можете ли вы проверить, что label = (UILabel *) [cell viewWithTag: 1]; фактически возвращает что-то, т. е. является меткой! = nil? Если это не ноль, не могли бы вы проверить, действительно ли вы получаете UILabel? Или попробуйте использовать другой тег (большее число) –

ответ

0

Чтобы было легче ответить, если вы дадите код, в котором вы создаете ячейки для просмотра таблицы.
Похоже, что существует проблема с повторным использованием ячеек - вы повторно используете ранее созданные ячейки, не устанавливая для него новое значение.

0

Похоже, что вы не используете повторно ячейки, но создаете новые, когда есть доступные ячейки. Посмотрите пример кода для dequeueReusableCellWithIdentifier.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"MyCell"] autorelease]; 
    } 

    cell.text = <your code here>; 
    return cell; 
} 
+0

Я разместил свой метод cellForRowAtIndexPath в сообщении выше. Я попробовал добавить «cell = [[[UITableViewCell alloc] initWithFrame: CGRectZero reuseIdentifier: @« MyCell »] autorelease]; « строка для моего кода, но ничего не изменила. – iYassin

1

Что вы пытаетесь выполнить с помощью cell0?

cell = cell0; 
self.cell0 = nil; 

Похоже, вы создаете новую ячейку, но каким-то образом решили использовать старый. Настоящий преступник выглядит как код, который загружает ячейку, фактически получая назначение в любом месте.

Попробуйте только вместо этого:

if (cell == nil) { 
    cell = [[NSBundle mainBundle] loadNibNamed:@"myCell" owner:self options:nil]; 
} 

Или, может быть:

if (cell == nil) 
{ 
    // TODO: try to avoid view controller 
    UIViewController *vc = [[UIViewController alloc] initWithNibName:@"IndividualContractWithResult" bundle:nil]; 
    cell = (IndividualContractWithResult_Cell *) vc.view; 
    [vc release]; 
} 
+0

Это не работает, оно дает предупреждение «несовместимые типы Objective-C, назначающие« struct NSArray », ожидаемые« struct UITableViewCell * », и если я получаю доступ к представлению, приложение мгновенно закрывается. – iYassin

+0

Извините, у меня снова есть доступ к моему коду. В нем я использую внешний NIB для загрузки в мои ячейки. Я добавлю это выше, чтобы форматировать. –

+0

Я вижу, где теперь идет cell0. Предполагается, что вы перезагружаете весь NIB, чтобы получить новую ячейку, которую вы затем используете в качестве своей ячейки. Интересно, если вы работаете с низким объемом памяти, что приводит к освобождению этих ранних захватов. Затем они используются повторно для последующих элементов. –

0

Казалось бы, что вы неправильно доступ к свойству здесь:

cell = cell0; 
self.cell0 = nil; 

Если предположить, что у вас есть переменную экземпляра с именем cell0, установив ее на нуль, вы можете освободить ее, прежде чем будете готовы ее использовать.

Правильный способ сделать это:

cell = self.cell0; 
self.cell0 = nil; 

Таким образом, если cell0 объявлен как сохранить, вы автоматически получаете autoreleased cell0 назад, в то время как если вы не ссылаться cell0 напрямую (не сам). , вы получите недостижимую ссылку, которая исчезнет при вызове self.cell0 = nil.

Преимущество использования ячейки на основе ниба заключается в том, что вы можете использовать выходы, а не теги, для идентификации подзонов. Вы уже сделали тяжелую работу, вы можете просто добавить выход и подкласс UITableViewCell, чтобы получить доступ к метке.

+0

-> выходы/метки: Да, но у меня есть 18 строк, созданных из одной пользовательской ячейки, и я хочу получить доступ к одной конкретной метке в одной конкретной ячейке, поэтому я не могу использовать выходы, верно? -> cell0/self.cell0: Это тоже не сработало ... – iYassin

+0

Непонятно, что такое cell0. Это переменная экземпляра? Если это свойство (которое, как представляется,), как оно объявляется? сохранить или назначить? Не видя остальной части вашего кода, я не могу быть уверен, но я думаю, что есть что-то не так, как вы повторно используете свои камеры. –

+0

cell0 - это UITableViewCell, объявленный в моем заголовочном файле диспетчера, я назначил его ячейке (которая находится в пустом XIB-файле) в IB. Он объявлен как @property (неатомный, сохраняющий) UITableViewCell ... в файле .h. – iYassin

0

Вам необходимо сохранить и сохранить ячейку 0, в противном случае, если вы установите self.cell0 = nil, тогда cell0 не имеет известных ссылок.

cell = [[cell0 retain] autorelease]; 
self.cell0 = nil; 

Вы также можете сделать это:

cell = self.cell0; 
self.cell0 = nil; 

.. Поскольку любое retain свойства должно реализовывать свои добытчик с сохранением/autorelease шаблона.

+0

Оба не работали ... – iYassin

+0

См. Мои правки для другого подхода ... – Jason

+0

Я добавил еще один код выше ... Я полагаю, что я должен заменить «MyViewController» в вашем коде именем моего контроллера представления? Я сделал это, и это сделало приложение закрытым, когда я получаю доступ к представлению.Возможно, проблема в том, что моя ячейка находится в дополнительном пустом XIB-файле? – iYassin