2011-01-13 5 views
0

안녕하세요. 최신 프로그램에서 NSTableView를 사용하여 왼쪽에 단어를 표시하고 오른쪽에 단어를 표시합니다. 이러한 단어와 정의는 .plist 파일에서로드되며 응용 프로그램 시작시 테이블보기는이 단어와 정의를로드하고 잘 표시합니다. 내 문제는 사용자가 텍스트 상자 및 단추를 사용하여 단어 및 정의를 추가하려고 할 때 단어가 실제로 .plist에 추가되어 메서드가 잘 실행되고 있음을 의미하지만 테이블 뷰는 새 줄을 표시하지 않습니다. 프로그램을 종료하고 테이블 뷰에 새 행을 다시 열 때까지만. 필자는 테이블보기가 selectedRow 및 dataSource와 같은 다른 메시지를 보내서 제대로 연결되었는지 확인하기 위해 테스트했습니다. 모두 응답으로 돌아 왔으며 적절한 응답이있었습니다. 현재 dataSource 및 델리게이트로 사용되는 클래스는 모든 내 변수 및 사전과 함께 내 주 클래스의 하위 클래스입니다. (나는 가능한 한 작은 클래스를 사용하는 데 큰 도움이된다.) 마지막으로 reloadData 전에 noteNumberOfRowsChanged를 삽입하려고 시도했지만 여전히 아무것도 삽입하지 않았습니다.NSTableView가 다시로드되지 않습니다.

나는 모든 것을 테스트했으며 reloadData 메소드가 아무 것도 시작하지 않은 것으로 보입니다. 내가 말했듯이, 내 테이블 뷰 메시지를 보냈고, 새로운 정보가 실제로 dicitinoary adn 배열에 추가되고, 행의 개수가 count 메소드에 의해 업데이트되고, 무엇이 더 많은 것을 증명하는지는 프로그램이 다시 시작하면 모든 것이 잘 표시됩니다. 아래는 관련 코드입니다. currentWordList 및 currentDefitionList는 dataSource에 데이터를 제공하는 Array 및 Dictionary이고 editLibraryCardList는 다시로드하려고하는 NSTableView입니다.

데이터 소스 클래스 코드 : 목록에 단어를 추가

@interface EditorDataTable : SAT_Vocab_MacController { 
    IBOutlet NSTableColumn *editLibraryWordColumn; 
    IBOutlet NSTableColumn *editLibraryDefinitionColumn; 
} 

- (int)numberOfRowsInTableView:(NSTableView *)tableView; 

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row; 

@end 

@implementation EditorDataTable 

- (int)numberOfRowsInTableView:(NSTableView *)tableView { 
    return ([currentWordList count]); 
} 

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row { 
    if (tableColumn == editLibraryWordColumn) { 
     return [currentWordList objectAtIndex:row]; 
    } 
    if (tableColumn == editLibraryDefinitionColumn) { 
     return [currentDefinitionList valueForKey:[[currentWordList objectAtIndex:row]lowercaseString]]; 
    } 
} 

@end 

방법 :

- (IBAction) editLibraryAddWordToLibrary: (id) sender { 

    if (self = [super init]) { 
     currentWordList = [[NSArray alloc] initWithContentsOfFile:userSATWordListPath]; 
     currentDefinitionList = [[NSDictionary alloc] initWithContentsOfFile:userSATDefinitionListPath]; 
    } 

    [currentWordList addObject:[[editLibraryNewCardWordInput stringValue]capitalizedString]]; 
    [currentDefinitionList setObject:[editLibraryNewCardDefinitionInput stringValue] forKey:[[editLibraryNewCardWordInput stringValue]lowercaseString]]; 

    aWordCounter = [currentWordList indexOfObject:[[editLibraryNewCardWordInput stringValue]capitalizedString]]; 

    [aWordLabel setStringValue: [[NSString alloc] initWithFormat:@"%@", [currentWordList objectAtIndex: aWordCounter]]]; 
    [aDefinitionLabel setStringValue: [[NSString alloc] initWithFormat:@""]]; 

    [currentWordList writeToFile:userSATWordListPath atomically:YES]; 
    [currentDefinitionList writeToFile:userSATDefinitionListPath atomically:YES]; 

    [cardCountdownNumber setStringValue: [[NSString alloc] initWithFormat:@"%i", ([currentWordList count] - (1 + aWordCounter))]]; 

    [editLibraryCardList noteNumberOfRowsChanged]; 
    [editLibraryCardList reloadData]; 
} 

Iv'e 며칠 동안 갇혀와 어떤 아이디어가 도움이됩니다! 감사. 자크

+1

"가능한 한 작은 수업을 사용하는 데는 큰 편"이것은 iOS 프로젝트를 유지 관리하는 악몽이 될 것입니다. iOS 프레임 워크는 많은 집중 클래스를 갖도록 고안되었습니다. 가능한 한 적은 클래스로 모든 것을 밀어 넣으려고 노력하면 모든 단계에서 프레임 워크와 싸우고 불필요한 골치 거리가 될 것입니다. 싸우지 마라. – kubi

답변

0

당신이 다시로드가 발생 있는지 확인하기 위해 selectRowAtIndexPath 방법으로 디버깅을 시도 했습니까? (당신이 호출 한 후 [tableView reloadData] 이것을 볼 수 있어야합니다) 당신은 UITableViewController를 사용하고 있습니까? 당신이이 완료되면, 당신은 시도 할 수 알고 다시로드 한 후 콜백을 원한다면

: 궁금해하는 사람들을 위해

[tableView reloadData]; 
    [self performSelector:@selector(selectRowAtIndexPath:) withObject:indexPath afterDelay:0.0]; 
0

, 내가 메인 클래스에 데이터 소스 서브 클래스에서 내 코드를 이동, 그리고 일 . 나는 당신이 dataSource를 서브 클래 싱 할 수 없다고 생각한다. 희망이 도움이!

관련 문제