2009-07-20 8 views
0

알았어. 나는 objective-c, cocoa, xcode 및 blah blah 등등에 대한 이해의 한계에 맞서야한다는 것을 알고있다. 하지만 여기에 내가 뭘하려고하는지 :UITableView 사용자 정의 셀 재설정 셀 내용

나는 viewcontroller에 tableview 있습니다. tableview의 delegate는 viewcontroller입니다. Viewcontroller에는 tableview에 대한 콘센트가 있습니다. 테이블은 사용자 정의 셀 (IB xib 포함)과 xml 파일의 데이터를 사용하여 결합됩니다. 사용자 정의 셀에는 두 개의 버튼이 있습니다. 셀이 생성되면 버튼 작업이 addTarget으로 self (viewcontroller)에 추가 된 다음 작업으로 이동합니다. viewcontroller 버튼 액션 메소드는 테이블에서 누른 버튼의 행을 가져 와서 셀의 텍스트와 버튼의 제목을 변경합니다.

물론 뷰에서 특정 셀을 스크롤하여 다시 볼 때 시작 상태로 재설정되었습니다. 나는 이것이 셀 dequeueing 등 모든 아이디어와 관련이 있다고 가정?

정의 셀 :

여기에 관련 비트와 코드의 버튼과 textLabel라는에 매장이있다.
1. 방식이있다 :

셀은

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath]; 
NSString *row = [NSString stringWithFormat:@"%i",[sender tag]]; 
if ([thisCell.languageButton.currentTitle isEqualToString:@"en"]) { 
    [thisCell.languageButton setTitle:@"zc" forState:UIControlStateNormal]; 
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_zc"]; 
} else { 
    [thisCell.languageButton setTitle:@"en" forState:UIControlStateNormal]; 
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_en"];   
} 

그래서 두 가지 질문이 ... 데이터 소스의 cellForRowAtIndexPath에 {

static NSString *dialogueCellIdentifier = @"dialogueCellIdentifier"; 

dialogue_cell *cell = (dialogue_cell *)[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier]; 

if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"dialogue_cell" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
    [[cell lButton] addTarget:self action:@selector(lButtonPressed:) forControlEvents:UIControlEventTouchUpInside];  
} 

[[cell lButton] setTag:[indexPath row]]; 

NSString *row = [NSString stringWithFormat:@"%i",[indexPath row]]; 
NSString *en = [[self.dataArray objectForKey:row] valueForKey:@"en"]; 

cell.mainText.text = en; 


return cell; 
} 

과 lButton 방법을 ... 코드를 만들 화면이 스크롤 되어도 레이블 및 단추 이름에있는 셀을 유지하게 하시겠습니까?
2. 거기에 단추가있는 viewcontroller 단추 동작을 보내는 대신 셀 사용자 지정 클래스 내에서 레이블 및 단추 이름을 설정하는 방법은 무엇입니까?

감사합니다.

답변

0

OK 내가 나를 awihle했다, 너무이 문제를했다하지만 난 그것을 알아낼, 셀 큐은 당신이

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath]; 

를 사용하고 다시 셀을 얻으려고 노력하는 경우가 여기에 열쇠이다 셀이 뷰에서 벗어나면 테이블 뷰가이 셀을 언로드하고 셀을 뷰에 다시 올릴 때까지 테이블보기의 긴 부분이 없으므로이 셀을 호출하면 원래 상태 (또는 prolly nil)의 셀을 가져옵니다. 화면.

당신이해야 할 일은 당신이 세포를 다시 대기열에 넣고 있기 때문에 당신이해야 할 일은 당신이 올바르게하고 있다고 가정하고 각 세포에 다른 이름을 부여하는 것입니다. cell like so

cell=[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier]; 

이것은 사용자가 수정 한 상태의 세포를 줄 것입니다. 희망이 있습니다! 두 번째 질문에 대해서는 대상을보기 컨트롤러 대신 셀로 설정하면 사용자 지정 셀 클래스 내에서 해당 동작이 호출됩니다.

+0

도움을 주셔서 감사합니다. 실제로 실제로 lostInTransit이 말한 것과 비슷한 방식으로 구성했습니다. 그 문제를 해결하는 그 느낌을 전혀 좋아하지 않는 것! –

1

실제로 대기열에서 제외 해제와 관련이 없습니다 cellForRowAtIndexPath에 표시 할 데이터는 제외합니다. 셀을 표시 할 때마다이 메서드가 호출됩니다.

버튼 클릭시 셀 텍스트의 언어가 변경된다고 가정합니다. 그러나 셀을 다시 그릴 때마다 영어 텍스트가 다시 표시됩니다.셀의 상태를 "유지"하는 한 가지 방법은 각 셀에 사용되는 언어에 대한 배열을 만들고 특정 행에 대한 배열의 값에 따라 셀의 텍스트를 채 웁니다. 배열에있는 셀의 상태를 유지하면됩니다.

+0

배열의 셀 상태를 유지해야합니다. 아니요, 내 게시물을 보지 마십시오. – Daniel

+0

실제로이 솔루션을 직접 내놓았습니다. 그것은 꽤 잘 작동합니다. (보이는 것처럼 조금 움직이게 만듭니다.) 내 테이블이 거의 15-20 셀보다 오래 걸리지 않으므로 다른 전략을 시도해보십시오. –