0

私が持っている 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 のデータソースとして使用される別のファイルを持つことだけです。

4

1 に答える 1

1

NSOutlineView を使用するとき、私は通常、何が起こっているのかを把握するために大量のログを記録します。私はおそらく次のようなことをするでしょう(おそらくあなたはすでにこれのいくつかを行っているでしょう):

たとえば、ログに記録して、subjectArray に実際にデータがあることを確認します。

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

AppDelegate.m ファイルのNSOutlineView Datasource Methodsから NSOutlineView Datasource プロトコル メソッドを実装し、適切なデータを返していることを確認してください。

  • これらの実装についてサポートが必要な場合は、Source Lists や NSOutlineViewなどのチュートリアルを試してください。

  • 私は通常、NSOutlineView データ ソース メソッドのそれぞれに NSLog ステートメントを追加して、それらが呼び出されていることを確認し、それぞれが何を期待して何を返しているのかを理解していることを確認します。

initWithManagedObject:(NSManagedObjectContext *)managedObject何らかの理由でデリゲートとデータソースがメソッドでログに記録して nil でないことを確認してください。

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

何らかの理由でそれらが nil であることがわかった場合は、それが問題ではないことを確認するために、たとえば initWithManagedObject で手動で設定できます。

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

これが「正しい」アプローチであるかどうかについては、コードからは、 sideBarController が と の両方であることを意図しているのdelegatedatasource、それともAppDelegateがそれらの役割を果たしているのかが明確ではありません。明らかに、適切なファイルにdelegatedatasourceプロトコルを実装する必要があります。sideBarController にそれをさせる方が理にかなっているように見えますが、確かAppDelegateにそれらの役割を果たすことができます。

ちょっとしたメモ: 私はときどき AppDelegate の managedObjectContext に、次のようなサポート ファイルから直接アクセスします。

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

managedObjectContext をすべてのファイルに手動で渡すのではなく。

于 2012-11-21T03:04:29.493 に答える