2012-11-20 4 views
0

내가 가진 NSOutlineView에 대해 별도의 컨트롤러 클래스를 만드는 데 문제가 있습니다.NSOutlineView 용 컨트롤러 만들기

LTSidebarViewController이라는 새 클래스를 만들고 MainMenu.xib 파일에 'workbench'에 객체를 추가하고 내 LTSidebarViewController 클래스에 링크했습니다. 또한 위임자와 데이터 소스를 MainMenu.xib의 NSOutlineView에 링크되도록 설정했습니다.

내 AppDelegate 파일에서 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 내에서이 클래스의 인스턴스를 만들고 그럴 때 App Delegate의 managedObjectContext를 전달하려고합니다. 그래서, 같은 보이는 LTSidebarViewController에서 사용자 지정 init 방법을 만들었습니다

-(id)initWithManagedObject:(NSManagedObjectContext*)managedObject{ 

    self = [super init]; 
    if (self) { 
     self.managedObjectContext = managedObject; 

     NSFetchRequest *subjectsFetchReq = [[NSFetchRequest alloc]init]; 
     [subjectsFetchReq setEntity:[NSEntityDescription entityForName:@"Subject" 
               inManagedObjectContext:self.managedObjectContext]]; 

     subjectsArray = [self.managedObjectContext executeFetchRequest:subjectsFetchReq error:nil]; 

     _topLevelItems = [NSArray arrayWithObjects:@"SUBJECTS", nil]; 

     // The data is stored in a dictionary 
     _childrenDictionary = [NSMutableDictionary new]; 
     [_childrenDictionary setObject:subjectsArray forKey:@"SUBJECTS"]; 

     // The basic recipe for a sidebar 
     [_sidebarOutlineView sizeLastColumnToFit]; 
     [_sidebarOutlineView reloadData]; 
     [_sidebarOutlineView setFloatsGroupRows:NO]; 

     // Set the row size of the tableview 
     [_sidebarOutlineView setRowSizeStyle:NSTableViewRowSizeStyleLarge]; 

     // Expand all the root items; disable the expansion animation that normally happens 
     [NSAnimationContext beginGrouping]; 
     [[NSAnimationContext currentContext] setDuration:0]; 
     [_sidebarOutlineView expandItem:nil expandChildren:YES]; 
     [NSAnimationContext endGrouping]; 

     // Automatically select first row 
     [_sidebarOutlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO]; 
    } 
    return self; 

} 

나는 또한이 클래스에서 필요한 모든 방법을 가지고 - (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item 등 앱 위임의 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 방법 내부

LTSidebarViewController *sidebarViewController = [[LTSidebarViewController alloc] initWithManagedObject:self.managedObjectContext]; 

내 문제는이, 내가 어떤 오류 및 응용 프로그램 실행을하지 않는 작동하지 않는 것입니다하지만 데이터가 NSOutlineView에 표시되지 않은 : 나는 다음 있습니다.

MainMenu.xib 파일을 처음로드 할 때 자동으로 LTSidebarViewController 클래스의 인스턴스를 만들고이를 init 메소드로 호출하지만 내 init 메소드가 응용 프로그램을 수행하지 않기 때문에 문제가 있음을 알 수 있습니다. 제대로 시작하지 못합니다.

여기 올바른 접근 방법이 있습니까? 간단히 말해서 내가 찾고있는 것은 NSOutlineView의 데이터 소스로 사용되는 별도의 파일을 갖는 것입니다.

답변

1

NSOutlineView로 작업 할 때 나는 일반적으로 무슨 일이 벌어지고 있는지를 알아 내기 위해 극도의 로깅을 실시했습니다. 아마도 다음과 같은 작업을 수행 할 것입니다 (어쩌면 이미이 작업을 수행 한 것일 수도 있습니다).

실제로 데이터를 기록하려면 subjectsArray에 로그인하십시오.

NSLog(@"subjectsArray"); 
NSLog(@"%@", subjectsArray); 

당신이 당신의 AppDelegate.m 파일에 NSOutlineView Datasource Methods에서 NSOutlineView 데이터 소스 프로토콜 방법을 구현했는지 확인하고 해당 데이터를 반환하고있다. 당신은이를 구현하는 데 도움이 필요하면

  • 는 같은 Source Lists and NSOutlineView 같은 자습서를보십시오.

  • NSOutlineView 데이터 소스 메서드마다 NSLog 문을 사용하여 NSOutlineView 데이터 소스 메서드가 호출되는 것을 확인하고 각 NSOutline이 무엇을 기대하고 반환하는지 이해할 수 있습니다.

귀하의 initWithManagedObject:(NSManagedObjectContext *)managedObject 메소드에서 대리인과 데이터 소스가 어떤 이유로 든 로깅되지 않도록하십시오 (예 :

NSLog(@"datasource: %@", [self datasource]); 
NSLog(@"delegate: %@", [self delegate]); 

어떤 이유인지 알 수 없다면 문제가 없는지 수동으로 설정할 수 있습니다. 예 :initWithManagedObject에 : 지금까지 이것이 "올바른"접근 여부 등

[self setDelegate: [NSApp delegate]]; 
[self setDatasource: [NSApp delegate]]; 

: 난 당신이 sideBarController가 AppDelegate가 모두 delegatedatasource 여부 것을 의도하고 있는지 코드에서 명확하지 않다 이러한 역할을 수행합니다. 분명히 적절한 파일에 delegatedatasource 프로토콜을 구현해야합니다. 특정 사용자가 AppDelegate에 역할을 맡길 수는 있지만 sideBarController를 사용하는 것이 더 합리적이라고 생각됩니다.

작은 노트 : 나는 가끔이 아니라 모든 파일을 수동으로 managedObjectContext를 전달하는 대신

-(NSManagedObjectContext *)managedObjectContext 
{ 
return [[NSApp delegate] managedObjectContext]; 
} 

처럼 뭔가 지원 파일에서 직접 AppDelegate에의 managedObjectContext에 액세스 할 수 있습니다.

+0

그 정보, 특히 AppDelegate의 managedObjectContext에 액세스하는 방법을 알려 주시면 감사하겠습니다. – Martyn

+0

위임자와 데이터 소스로'LTSidebarViewController'를 찾고 있다고 말했어야합니다. 문제는'LTSidebarViewController'가 데이터 소스이기 때문에 AppDelegate 전에 초기화되고 AppDelegate에 필요한 정보 (managedObjectContext)가 작동하지 않기 때문에 나타납니다. – Martyn

+0

그럴 경우 NSApp 대리인의 managedObjectContext에 액세스하면 데이터 소스 메서드가 호출 될 때 LTSidebarViewController가 액세스해야하므로 그 주위를 처리하게됩니다. – ccatalfo