2012-06-30 8 views
0

MainViewController에 UITableView가 있습니다. 사용자가 셀,UITableView는 8 번째 셀마다 이름을 바꿉니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

selectedRow = indexPath; 

.... 

[self performSegueWithIdentifier:@"OtherViewControllerSegue" sender:self]; 
} 

도청하고 다른 UIViewController에로 이동하는 경우 (의이 OtherViewController를 부르 자). OtherViewController에서 선택된 셀의 이름이 설정됩니다. OtherViewController이 기각되면 새 이름으로 MainViewController의 셀을 업데이트합니다

[[[mainvc.myTableView cellForRowAtIndexPath:mainvc.selectedRow] textLabel] setText:namecell.textField.text]; 
    [self.navigationController popViewControllerAnimated:YES]; 

내가 화면에 맞는 것보다 더 많은 세포를 할 때까지이 모두가 잘 작동합니다. 화면에 맞을 셀 (iPhone의 경우 8 개 또는 iPad의 경우 16 개)보다 많은 셀이있는 경우 8 번째 또는 16 번째 셀마다 이름이 설정됩니다. 내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

업데이트 :

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [pointsTableView dequeueReusableCellWithIdentifier:@"myTableCell"]; 
return cell; 
} 
+0

'tableView : cellForRowAtIndexPath :'코드를 게시하십시오. 재사용 셀에 이상한 점이 있습니다. – vikingosegundo

답변

2

이 세포 재사용에 기인하고 (MVC의 컨텍스트에서) 당신의 보기모델을 혼합한다.

테이블 셀은 일시적인 것으로 화면에서 벗어나면 다른 셀이 필요할 때 새 셀을 만드는 대신 재사용됩니다. 이것이 바로 dequeueReusableCellWithIdentifier: 방법입니다.

이것은 데이터를 거기에 저장할 수없고 나중에 계속 유효하다고 기대할 수 있음을 의미합니다. 이 예제에서는 테이블의 셀에 이름을 저장하려고합니다. 보기 객체의 레이블 텍스트와 같은 속성을 설정하는 이유는 저장소가 아닌 표시하기위한 것입니다. 따라서이 문제를 해결하려면 모델 (예 : mainvc 개체의 별도 클래스 또는 배열에있을 수 있음)에있는 개체 목록을 유지 관리해야합니다.그런 다음 cellForRowAtIndexPath:에서 매번 레이블 텍스트를 설정해야합니다. 레이블이 없어도 셀을 nil로 설정하거나 빈 문자열로 설정해야 할 필요가 있더라도 셀을 다시 사용하기 때문에 마지막으로 사용한 시간이 포함될 수 있습니다.

업데이트 : 대신 자신을 cellForRowAtIndexPath:를 호출하고 해당 텍스트를 설정하는, 당신이 당신의 컨트롤러 메서드 또는 속성을 사용하여 모델의 텍스트를 설정 한 다음 해당 셀을 다시로드 테이블 뷰를 말해야한다.

// This code is in where you want to set the text from 
[mainvc setText:someText forIndexPath:indexPath]; 

.. 및 기본 뷰 컨트롤러에서 :

- (void)setText(NSString*)newText forIndexPath:(NSIndexPath*)indexPath 
{ 
    // Store the text in your model here... 
    ... 

    // If the view is loaded, the table view should reload the cell. 
    if(self.isViewLoaded) 
    { 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
} 

테이블 뷰가 다음 텍스트가 올바르게 설정됩니다 cellForRowAtIndexPath:를 호출하는 코드는 다음과 같이 보일 수 있습니다. 처음에는 조금 복잡하게 보일 수도 있지만, Model-View-Controller 디자인 패턴을 사용하는 데 익숙해지면 각 MVC 구성 요소의 작업을 이와 같이 별도로 유지하면 코드가 더 깔끔하고 이해하기 쉽다는 것을 알 수 있습니다. 버그 수정, 업데이트/확장하기가 더 쉽습니다.

+0

ok 방금 시도해 보았지만 내 이름 바꾸기 코드를 꺼 냈습니다. 이름이 바뀐 셀은 화면에서 벗어나서 다시 돌아올 때까지 이름이 변경되지 않고 해당 셀의 이름이 바뀌면 곧 8 번째 셀의 이름도 바뀝니다. before – Garrett

+0

필자는 설정하지 않을 경우 명시 적으로 텍스트를 nil로 설정하여 이름 바꾸기 문제를 해결했습니다. 그러나 화면을 벗어날 때까지는 셀의 업데이트 문제가 여전히 남아 있습니다. 어떻게 해결할 수 있을까요? – Garrett

+0

나는 그것을 작동시키지 않아도된다. – Garrett

0

내 생각으로, 당신은 자신에 의해 cellForRowAtIndexPath를 호출하지 않아야합니다. 셀을 변경하기 위해 호출 할 수 있습니다. 대리인을 통해 첫 번째보기에 필요한 문자열을 전달하여 테이블을 업데이트 할 수 있습니다. 이벤트 (사용자가 이름을 설정)에서 모든 테이블을 업데이트하고 필요한 이름을 셀에 설정할 수 있습니다.

0

문제가 무엇인지 정확하게 말할 하드,하지만 하나의 가능한 해결책이 될 수 있습니다 내가 아는

// Create the Cell 
    static NSString *recordCell = @"pickerTableCell"; 
    cell = [tableView dequeueReusableCellWithIdentifier:recordCell]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:recordCell]; 
    } 

이것이다 :

이 cellForRowAtIndexPath에서이 같은 세포를 초기화되었는지 확인 주로 메모리 솔루션이지만, 여기에서도 도움이 될 수 있습니다.

또한 코드를 살펴보고 이름이 바뀐 셀을 어떻게 결정하는지 확인하십시오. 실수로 두 개 이상의 셀에서 이름 바꾸기를 호출 할 수 있습니다.

2

데이터 (새 이름)를 뷰 (셀의 레이블)에 저장하려고합니다. 아마도 일어날 수있는 것은 데이터 소스의 cellForRowAtIndexPath 메소드에서 셀을 재사용 할 때 그 중 일부는이 텍스트 세트를 가지고 있고 아직 거기에 있다는 것입니다.

더 나은 아이디어는 셀 정보로 사용하는 배열을 변경 한 다음 테이블보기를 다시로드하여 변경 사항을 표시하는 것입니다.

관련 문제