Проблема добавления UITableViewCell вручную - PullRequest
0 голосов
/ 01 июня 2010

Я пытаюсь добавить UITableViewCell в самом низу моего UITableView программно. Я получаю сообщение об ошибке индекса за границами, которую я не знаю, как решить:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [items count]+1;
}

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

    static NSString *CellIdentifier = @"Cell";

    if (indexPath.row == [items count] + 1) {
        UITableViewCell* cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MoreCell"] autorelease];
        cell.textLabel.text = @"More...";
        return cell;
    }
    else {
        STUser *mySTUser;
        mySTUser = [items objectAtIndex:indexPath.row]; //!!INDEX OUT OF BOUNDS HERE!!

        AsyncImageView* asyncImage = nil;
        UILabel* loginLabel = nil;
        UILabel* fullNameLabel = nil;
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            CGRect frame = CGRectMake(0, 0, 44, 44);
            CGRect loginLabelFrame = CGRectMake(60, 0, 200, 10);
            CGRect fullNameLabelFrame = CGRectMake(60, 20, 200, 10);
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:nil] autorelease];
            asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease];
            [cell.contentView addSubview:asyncImage];
            loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
            [cell.contentView addSubview:loginLabel];
            fullNameLabel = [[[UILabel alloc] initWithFrame:fullNameLabelFrame] autorelease];
            [cell.contentView addSubview:fullNameLabel];    
            asyncImage.tag = IMAGE_TAG;
            loginLabel.tag = LOGIN_TAG;
            fullNameLabel.tag = FULL_NAME_TAG;      
        }
        else {
            asyncImage = (AsyncImageView *) [cell.contentView viewWithTag:IMAGE_TAG];
            loginLabel = (UILabel *) [cell.contentView viewWithTag:LOGIN_TAG];
            fullNameLabel = (UILabel *) [cell.contentView viewWithTag:FULL_NAME_TAG];
        }

        // Configure the cell...

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        CGRect frame = CGRectMake(0, 0, 44, 44);
        asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease];
        NSURL* url = [NSURL URLWithString:mySTUser.avatar_url_large];
        [asyncImage loadImageFromURL:url];
        asyncImage.tag = IMAGE_TAG;
        [cell.contentView addSubview:asyncImage];
        CALayer * l = [asyncImage layer];
        [l setMasksToBounds:YES];
        [l setCornerRadius:5.0];

        CGRect loginLabelFrame = CGRectMake(60, 0, 200, 20);
        loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease];
        loginLabel.text = [NSString stringWithFormat:@"%@",mySTUser.login];
        loginLabel.tag = LOGIN_TAG;
        [cell.contentView addSubview:loginLabel];

        CGRect fullNameLabelFrame = CGRectMake(60, 20, 200, 20);
        fullNameLabel = [[[UILabel alloc] initWithFrame:fullNameLabelFrame] autorelease];
        fullNameLabel.text = [NSString stringWithFormat:@"%@ %@",mySTUser.first_name, mySTUser.last_name];
        fullNameLabel.tag = FULL_NAME_TAG;
        fullNameLabel.font = [UIFont fontWithName:@"Helvetica" size:(12.0)];
        [cell.contentView addSubview:fullNameLabel];    

        return cell;
    }
}

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

Ответы [ 2 ]

1 голос
/ 01 июня 2010

indexPath.row основывается на нуле.

Изменение:
if (indexPath.row == [items count] + 1) {
Для того, чтобы:
if (indexPath.row == [items count]) {

0 голосов
/ 01 июня 2010

Массивы в Objective-C и почти во всех других языках программирования начинаются с нуля. Это означает, что первый объект имеет индекс 0, а последний объект имеет индекс (длина - 1).

Следовательно, условие

if (indexPath.row == [items count] + 1) {

следует изменить на

if (indexPath.row == [items count]) {
...