私が持っている NSOutlineView 用に別の Controller クラスを作成することに関して問題があります。
という名前の新しいクラスを作成LTSidebarViewController
し、MainMenu.xib ファイルにオブジェクトを「ワークベンチ」に追加して、LTSidebarViewController
クラスにリンクしました。また、デリゲートとデータソースを MainMenu.xib の NSOutlineView にリンクするように設定しました。
私がやろうとしているのは- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
、AppDelegate ファイル内からこのクラスのインスタンスを作成することです。その際、App Delegate の managedObjectContext を渡したいと考えています。そこで、次のようなカスタムinit
メソッドを作成しました。LTSidebarViewController
-(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
このクラスなどに必要なすべてのメソッドもあります。
App Delegateのメソッド内- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
には、次のものがあります。
LTSidebarViewController *sidebarViewController = [[LTSidebarViewController alloc] initWithManagedObject:self.managedObjectContext];
私の問題は、これが機能していないことです。エラーは発生せず、アプリは実行されますが、NSOutlineView にデータが表示されません。
今私が言えることは、MainMenu.xib ファイルが最初に読み込まれるときに、LTSidebarViewController
クラスのインスタンスが自動的に作成され、それが init メソッドを呼び出すことですが、init メソッドが何もしていないため、アプリの起動が完了しないということです。正しく。
ここで正しいアプローチを取っていますか?簡単に言えば、私が探しているのは、NSOutlineView のデータソースとして使用される別のファイルを持つことだけです。