2009-03-26 3 views
2

정보를 다른보기에서 삽입 한 후에 업데이트해야하는 tableView가 있습니다. 내가 수행하는 경우iPhone SDK : 새 행으로 UITableView 삽입 및 업데이트

[self.tableView reloadData]; 

내가 다른보기에서 더 많은 정보를 삽입하고 테이블을 다시로드하려고 바로 다음에, 모든 현재 보이는 행이 복제됩니다. 나는 응용 프로그램을 시작할 때 즉

, 내가 가진 :

tableView: 
    Row 1 
    Row 2 

그리고 나는 또한 표에 표시됩니다 몇 가지 정보를 입력하고 갑자기 내가 가진 :

tableView 
    Row 1 
    Row 2 
    Row 3 <- info I just added 
    Row 1 
    Row 2 

내 numberOfRowsInSection 구현은 다음과 같습니다.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [ItemsController sharedItemsController].count; 
} 

내 cellForRowAtIndexPath 구현 모양 다음과 같이하십시오 :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ItemsController* controller = [ItemsController sharedItemsController]; 
    NSMutableArray* recentItems = controller.listOfRecentItems; 

    CustomCell *cell = nil; 
    NSUInteger row = [indexPath row]; 

    if(row < recentItems.count) 
    { 
     Items* item = [recentItems objectAtIndex:row]; 
     if(recentCellData == nil) 
      recentCellData = [[NSMutableDictionary alloc] initWithCapacity:[indexPath length]]; 

     if([recentCellData count] > 0) 
      cell = [recentCellData objectForKey:[NSString stringWithFormat:@"%d", row]]; 
     if (cell == nil) { 
      UIViewController * view1 = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil]; 

      cell = (CustomCell*)[view1 view]; 

      [recentCellData setObject:cell forKey:[NSString stringWithFormat:@"%d",row]]; 
     } 

     // do some other stuff here 
    } 
    // Set up the cell 
    return cell; 
} 

테이블을 업데이트하고 현재 보이는 행이 중복되지 않도록하는 가장 좋은 방법은 무엇입니까? 모든 도움을 미리 보내 주셔서 감사합니다!

+0

질문에 tableView : numberOfRowsInSection : 메서드의 구현을 포함해야하는 것처럼 보입니다. – dstnbrkr

+0

질문에 그 정보를 추가했습니다. 감사! – Jeff

답변

3

오류는 테이블을 다시로드하는 방법이 아니라 데이터를 어떻게 제공하고 있는지에 있습니다. 데이터 소스 메서드와 새 행을 추가하는 메서드에 중단 점을 설정하여 잘못된 위치를 확인합니다.

1

위의 정보를 조금 더 추가했습니다.

2

tableView:numberOfRowsinSection:5 인 경우 5 개만 남게됩니다. 그 질문에 대한 간단한 대답이 있긴하지만 여기에는 다른 문제가 있습니다. 왜이 검사를 받는지 궁금합니다 : row < recentItems.count. 이 배열은 [ItemsController sharedItemsController].count과 같은 것입니까? 두 가지 방법 모두에 대해 동일한 배열을 사용해야합니다.

(또한,이 구문 오류가 아니지만, 당신은 속성으로 선언되지 않은 것들에 대한 속성 구문을 사용할 수 없습니다. 대신 [recentItems count]을 작성해야합니다.)

나는 또한 혼동하고있어 코드를 사용하여 셀을 설정하십시오. 세포는 재사용이 가능합니다. 즉, 하나의 셀을 만든 다음 구현할 때마다 tableView:cellForRowAtIndexPath:을 다시 구성합니다. 코드는 목록의 각 항목에 대한 셀을 만듭니다. 이것은 매우 비효율적 인 메모리이며, 많은 양의 셀을 이와 같이 메모리에 보관하면 iPhone의 메모리 부족으로 인해 프로그램이 중단 될 수 있습니다.

권장 방법은 dequeueReusableCellWithIdentifier:입니다. 그 경우 nil을 반환하면 initWithFrame:reuseIdentifier: 이니셜 라이저를 사용하여 셀을 설정합니다. 테이블보기는 매우 영리하며, 필요할 때만 셀을 다시 그리도록 요청합니다.

recentCellData 사전도 나에게 너무 불안정 해 보입니다. 키가 @"2" 인 항목 뒤에 항목을 삽입하면 어떻게 될까요? 키 @"3" 이후의 모든 항목은 예상대로 작동하려면 오른쪽으로 한 요소 이동해야합니다. 그것은 저에게 불필요하게 보이는 부기의 톤입니다. 이와 같은 것을 정말로 필요로한다면 - 분명히하기 위해, 나는 당신이 생각하기에 - 왜 NSMutableArray을 사용하지 않을 것인가?

+0

NSMutableArray를 사용하고 있습니다. 보기가 표시되는 방법에 관한 것입니다. 앱을 종료하고 다시 시작하면 모든 것이 그대로 표시됩니다. – Jeff

+0

recentCellData를 참조하고있었습니다. 그건 사전이야. – Alex

+0

무슨 뜻인지 알 겠어. 내가 이걸 해결할 수 있는지 알아 보자 ... – Jeff

관련 문제