ios - Objective-c только первая ячейка UITableView не показывает метку, которую я добавил - PullRequest
2 голосов
/ 24 июля 2011

Я пытаюсь добавить число от 1 до 9 из plist в каждую ячейку в UITableView.Однако первый вид ничего не показывает, и 1 отображается во второй ячейке, 2 отображается в третьей ячейке и так далее.Я сделал несколько тестов, добавив NSLog(@"test"); внутри if(cell==nil), но напечатано только 7 "тестов", в то время как есть 9 ячеек. Значит ли это, что коды внутри if(cell==nil) не выполняются для первой и последней ячеек?Кто-нибудь хочет решить эту проблему?: (

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        NSLog(@"hi");
        //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell = [self getCellContentView:CellIdentifier];

        //add another textfield
        NSString *rankpath = [[NSBundle mainBundle] pathForResource:@"Rankvalue" ofType:@"plist"];
        NSMutableArray* rank = [[NSMutableArray alloc] initWithContentsOfFile:rankpath];
        rankValue = [rank objectAtIndex:indexPath.row];
        rankLabel = (UILabel *)[cell viewWithTag:1];

        // Configure the cell(thumbnail).
        cell.textLabel.text = [self.stars objectAtIndex:indexPath.row];
        [cell.textLabel setFont:[UIFont fontWithName:@"ALBA" size:[@"25" intValue]]];
        NSString *filepath = [[NSBundle mainBundle] pathForResource:@"Filename" ofType:@"plist"];
        self.filename = [[NSMutableArray alloc] initWithContentsOfFile:filepath];

        //transparent cell
        cell.backgroundColor = [UIColor clearColor];
   }
   //label
   rankLabel.text = rankValue;
   //[rankLabel setFont:[UIFont fontWithName:@"austin power" size:[@"40" intValue]]];
   //rankLabel.textColor = [UIColor redColor];

   CGRect labelFrame = CGRectMake(220,70,50,40.0);
   [rankLabel setFrame:labelFrame];

   cell.imageView.image = [UIImage imageNamed:[self.filename objectAtIndex:indexPath.row]];

   //cell.imageView.image = [UIImage imageNamed:[self.filename objectAtIndex:indexPath.row]];

   return cell;
}

Вот еще один метод, который я добавил для подпредставлений

//new method for different text in each cell
- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier
{

    CGRect CellFrame = CGRectMake(0, 0, 320, 65);
    CGRect Label1Frame = CGRectMake(17,5,250,18);  

    UILabel *lblTemp;

    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

    //UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:cellIdentifier] autorelease];  
    lblTemp = [[UILabel alloc] initWithFrame:Label1Frame];
    [lblTemp setFont:[UIFont fontWithName:@"austin power" size:40]];
    lblTemp.textColor = [UIColor redColor];
    lblTemp.tag = 1;
    lblTemp.backgroundColor=[UIColor clearColor];
    lblTemp.numberOfLines=0;
    [cell.contentView addSubview:lblTemp];

    return cell;
}

Спасибо, кстати, за симулятор 4.2, который я использую.

Ответы [ 2 ]

1 голос
/ 24 июля 2011

Тем более, что ваша проблема касается первых нескольких ячеек, точка останова в tableView: cellForRowAtIndexPath: с последующим пошаговым переходом по подозрительным линиям, вероятно, поможет вам понять, что происходит.окна кода в первой строке кода в tableView: cellForRowAtIndexPath:, то есть это:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

Теперь нажмите на маленькую стрелку «прыгания» над локальными переменными, чтобы перейти на одну строку кода впередвремя.

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

Обратите внимание на фактические значения массивов данных, и вы будете намного мудрее в том, что ваше приложение делает, когда оно работает.

1 голос
/ 24 июля 2011

При первом отображении UITableView, tableView:cellForRowAtIndexPath: вызывается один раз для каждой видимой ячейки. Это связано с тем, что UITableView перезапускает ячейки из пула повторного использования и является пустым, поэтому dequeueReusableCellWithIdentifier: возвращает ноль.
Ваш код выделит 7 видимых ячеек, поэтому «тест» печатается 7 раз.

Как вы понимаете, почему во второй ячейке отображается «1», вы уверены, что в первой строке массива plist нет пустого элемента?

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

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