본문 바로가기
프로그래밍/iOS

tableview에 "Twenty Five More..." 같은 기능

by 백룡화검 2011. 7. 5.
제가 앱스토어에 어플목록 나오는 것 처럼 "Twenty Five More..." 같은 버튼을 누르면 테이블뷰의 셀의 수가


더 늘어나면서 추가되는걸 구현하려고 하는데요.  (데이터는 한번에 10개씩 파싱해서 가져옵니다.)


처음에 맨위(index.row ==0) 의 셀부터 10개의 데이터와 맨밑인 11번째 셀((index.row ==10)에 "10개 더 불러오기"는


제대로 표시가 됩니다. 셀 높이는 한번에 7개씩 보일 정도의 크기이구요.


그런데 테이블뷰를 11번째 셀이 보이도록 맨 위로 한번 올리고 나면 위에서 두번째(index.row ==1) 셀의 내용이


파싱해서 가져온 내용이 아니라 "10개 더 불러오기"로 바뀝니다. 두번째 셀은 화면에서 사라졌다가 나타난 셀이구요.


테이블뷰를 잡고(?) 끝까지 올렸다 내렸다 몇번 하면 하면 화면에서 사라졌던 셀들이 몇개 더 "10개 더 가져오기"로


바뀌구요.   if ([indexPath row] < [dataArray count])  이 부분을 == 로 바꿔서도 해보고


조건과 그안의 내용을 바꾸면서 여러번 시도해봤는데 결과는 똑같네요...혹시나 해서 각 셀마다 로그를 찍어봐도


저 조건에 두개가 같아지는 때는 맨 마지막 셀이 화면에 나타날때 뿐인데 실제 보여지는 내용은


왜 그렇게 달라지는지 모르겠습니다. 제가 어디를 잘못한건지....;; 아무리 봐도 모르겠어요ㅠ


아시는분 계시면 알려주세요~~제발ㅠㅠㅠ 밤새고 몽롱한 상태에서 썼더니 글 내용이 좀...말이 이상한것 같네요-_-



(10개 더 불러오기를 눌러서 파싱해서 가져오는 데이터를 보면 10개씩 증가하면서


파싱하고 저장은 제대로 되고 있습니다. 실제로 셀이 보여지는 개수도 11개에서 21개, 31개 제대로 늘어나고 있구요.


단지 셀의 표시 내용이 제 의도에 안맞게 자꾸 바뀌는게 문제입니다....


http://cafe.naver.com/mcbugi/48620  이글을 보고 해봐도 안돼요ㅠ)


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSInteger row = [indexPath row];
    
    if ([indexPath row] < [dataArray count]) { //  인덱스는 0~9, 0~19 이런식이고 데이터 수는 10개, 20개 이런식이라서

        if (cell == nil) {                                    //   이 조건이 틀리게 되면 ( [indexPath row] == [dataArray count] )

                                                                  //   else 로 가서 더보기가 나타날거라고 생각하고 이렇게 만들었습니다-.-

            [[NSBundle mainBundle] loadNibNamed:@"ListCustomCell" owner:self options:nil];
            cell = listCustomCell;
        }
        NSDictionary *rowData = [dataArray objectAtIndex:row];
        UILabel *lblTitle;
        UILabel *lblDate;
        UILabel *lblHits;
       
        lblTitle = (UILabel *)[cell viewWithTag:1];
        lblTitle.text = [rowData objectForKey:@"title"];
       
        lblDate = (UILabel *)[cell viewWithTag:2];
        lblDate.text = [rowData objectForKey:@"date"];
       
        lblHits = (UILabel *)[cell viewWithTag:3];
        lblHits.text = [rowData objectForKey:@"hits"];
    }

    else {
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                           reuseIdentifier:CellIdentifier] autorelease];
        }
        cell.textAlignment = UITextAlignmentCenter;
        cell.textLabel.text = @"이전 10개 불러오기";
    }
    return cell;
}


================================================================


아래가 수정 후 제대로 돌아가는 소스입니다.


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
//    static NSString *CellIdentifier = @"Cell";     // 이름을 달리하여 두개를 만들어 각 각 if, else문 안으로 옮김
//                                                             
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSInteger row = [indexPath row];
    
    if ([indexPath row] < [dataArray count]) { 


        static NSString *CellIdentifier = @"ListCell";
       
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


        if (cell == nil) { 

            [[NSBundle mainBundle] loadNibNamed:@"ListCustomCell" owner:self options:nil];
            cell = listCustomCell;
        }
        NSDictionary *rowData = [dataArray objectAtIndex:row];
        UILabel *lblTitle;
        UILabel *lblDate;
        UILabel *lblHits;
       
        lblTitle = (UILabel *)[cell viewWithTag:1];
        lblTitle.text = [rowData objectForKey:@"title"];
       
        lblDate = (UILabel *)[cell viewWithTag:2];
        lblDate.text = [rowData objectForKey:@"date"];
       
        lblHits = (UILabel *)[cell viewWithTag:3];
        lblHits.text = [rowData objectForKey:@"hits"];
    }

    else {


        static NSString *CellIdentifier = @"LoadMoreCell";
       
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                           reuseIdentifier:CellIdentifier] autorelease];
        }
        cell.textAlignment = UITextAlignmentCenter;
        cell.textLabel.text = @"이전 10개 불러오기";
    }
    return cell;
}

출처 : http://cafe.naver.com/mcbugi/117402