Возвращение большего количества ячеек в UITableView - PullRequest
1 голос
/ 03 июня 2011

Я использую MGTwitterEngine и почти все выяснил, но по какой-то причине я не могу понять, как вернуть больше твитов в моей временной шкале!Он получает около 20 твитов по методу, который я использую, и если я добавлю целое число, например: return count = 100;, я могу сказать, что теперь у меня есть 100 ячеек, когда он загружается и по индикатору прокрутки, но когда я прокручиваю до этой ячейки 18-19Я получаю эту ошибку:

SIGABRT - [NSMutableArray objectAtIndex:]: индекс 20 за пределами [0 .. 19] '* Стек вызовов при первом броске:

Я знаю, что это значит: больше нет информации для получения в ячейке 20. Я сбит с толку и вошел и вышел из MGTwitterEngine в поиске количества твитов по умолчанию, но не могу его найти.Я использую дамп для создания моих NSString с, и дамп, кажется, дает только около 20 твитов на логин.Пожалуйста, помогите, любые предложения хороши в моей книге!Спасибо!

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    int count = [tweets count];
    // Return just enough cells to fill the screen during loading ....
    if (count == 0)
        count = MyCustomRowCount;
        else {
            //Here is where I think I need to add a else return integer but dont know how
        }
    return count;
    return [tweets count];
    return [authors count];
    return [avatarsURL count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *identifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) { 
        [cell autorelease];
    }

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]autorelease];
    /*
     //Here it adds a nice shadow to the table view but will crash on rotation and send a  
     wird dump  !!!???? 
     tableView.layer.shadowColor = [[UIColor blackColor] CGColor];
     tableView.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
     tableView.layer.shadowRadius = 8.0f;
     tableView.layer.shadowOpacity = 1.0f;     
     */
    [cell.textLabel setNumberOfLines:1];
    [cell.textLabel setText:[(Tweet*)[authors objectAtIndex:indexPath.row] author]];  
    [cell.detailTextLabel setText:[(Tweet*)[tweets objectAtIndex:indexPath.row] tweet]];
    [cell.detailTextLabel setNumberOfLines:10];
    [cell.textLabel setTextColor:[UIColor darkGrayColor]];
    [cell.textLabel setShadowColor:[UIColor whiteColor]];
    [cell.textLabel setShadowOffset:CGSizeMake(0.5, 0.5)];
    [cell.detailTextLabel setTextColor:[UIColor blackColor]];
    //[cell.detailTextLabel setText:[(Tweet*)[retweetCount objectAtIndex:indexPath.row] 
    reTweetCount]];
    [cell.textLabel setUserInteractionEnabled:YES];
    [cell.contentView setMultipleTouchEnabled:YES];
    // cell.text = [[NSString alloc] initWithFormat:@"Cell :%i", indexPath.row];    


    // Here we use the new provided setImageWithURL: method to load the web image with 
    SDWebImageManager
    [cell.imageView setImageWithURL:[NSURL URLWithString:[(Tweet*)[avatarsURL   
                                                                   objectAtIndex:indexPath.row]avatarURL]]
                   placeholderImage:[UIImage imageNamed:@"avatar.png"]];

    //add gradient to cell 
    UIImage *gradient = [UIImage imageNamed:@"gradientcell2.png"];
    UIImageView *cellimage = [[UIImageView alloc] initWithImage:gradient];
    cellimage.contentMode = UIViewContentModeScaleToFill;
    cell.backgroundView = cellimage;
    [cellimage release];      

    UIImage *selectedGradient = [UIImage imageNamed:@"selectedcell.png"];
    UIImageView *selectedCell = [[UIImageView alloc] initWithImage:selectedGradient];
    selectedCell.contentMode = UIViewContentModeScaleToFill;
    cell.selectedBackgroundView = selectedCell;    
    [tableView setBackgroundColor:[UIColor clearColor]];     
    return cell;
}

//get cell accessory  
-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView   
accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row < [tweets count]){

    }    
    return UITableViewCellAccessoryDisclosureIndicator;
}

// custom hieght 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
    return 80;
}

//select tweet bring to detail view ..... Also bring in the Users information who made the tweet!
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {

    //Get the selected tweets
    NSString *selectedTweet = [(Tweet*)[tweets objectAtIndex:indexPath.row] tweet]; 
    NSString *selectedUser = [(Tweet*)[tweets objectAtIndex:indexPath.row] author];
    NSString *selectedUserInfo = [(Tweet*)[tweets objectAtIndex:indexPath.row] user];
    NSString *retweetCount = [(Tweet*)[tweets objectAtIndex:indexPath.row] reTweetCount ];
    // NSString *selectedUserFriendsCount = [(Tweet*)[tweets objectAtIndex:indexPath.row] userFriendsCount];------HUH? NO soup for ME!
    NSString *selectedUserFollowersCount = [(Tweet*)[tweets objectAtIndex:indexPath.row] userFollowersCount];   

    //Initialize the detail view controller and display it.
    TwitterDetailViewController*dvController = [[TwitterDetailViewController alloc]
                                                initWithNibName:@"TwitterDetailViewController" bundle:[NSBundle mainBundle]];
    dvController.selectedTweet = selectedTweet;
    dvController.selectedUser = selectedUser;
    dvController.selectedUserInfo = selectedUserInfo;
    // dvController.selectedUserFriendsCount = selectedUserFriendsCount;------Doesnt reconize the call for some odd reason!
    dvController.selectedUserFollowersCount = selectedUserFollowersCount;   
    dvController.retweetCount = retweetCount;
    dvController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:dvController animated:YES];
    //[self.navigationController pushViewController:webController animated:YES];-------would rather use  navagation controller for several obvious reasons
    [dvController release];
    dvController = nil;
}

1 Ответ

0 голосов
/ 03 июня 2011

UITableView не нравится, когда вы даете ему что-то непоследовательное. Если вы измените модель, вам нужно вызвать [tableView reloadData] или, если вы хотите анимировать изменения, вызвать [tableView BeingUpdate] [tableView endUpdate] со всеми операциями вставки / удаления ячеек в середине.

С другой стороны, я не уверен, почему вы здесь делаете:

NSString *identifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (cell == nil) { 
        [cell autorelease];
}

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
reuseIdentifier:@"cell"];
[cell autorelease];

Сначала, если (cell == nil), вызов автоматического освобождения для него ничего не даст.

Идентификатор повторного использования - это шаблон с наименьшим весом. Если dequeueReusableCellWithIdentifier: возвращает nil, это означает, что у него нет объекта ячейки в пуле, и вы должны выделить для него новый. dequeueReusableCellWithIdentifier также уже возвращает объект автоматического освобождения.

Вместо этого попробуйте это:

NSString *identifier = @"mytweetcell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier] autorelease];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...