Представление таблицы iPhone - проблема с indexPath.row - PullRequest
0 голосов
/ 11 ноября 2009

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

Ответы [ 5 ]

1 голос
/ 12 ноября 2009

Чего вы пытаетесь достичь с помощью 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 голосов
/ 26 ноября 2009

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

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

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

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

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

0 голосов
/ 26 ноября 2009

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

cell = cell0;
self.cell0 = nil;

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

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

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

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

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

0 голосов
/ 11 ноября 2009

Похоже, вы не используете ячейки повторно, а создаете новые, когда ячейки доступны. Посмотрите пример кода для 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 голосов
/ 11 ноября 2009

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

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