Obj.C

obj.C:NSTreeControllerで強引にやったらOKに!

あの手この手で無理矢理やったら、やりたいことができました。

▶︎Interface Builder

IBOutlet NSTreeController *xbTreeCont;//IBでTree Controllerと接続

▶︎MesaCont.m

右側ペインのツリーで展開されているファイルパスをクリックされたときにIBActionメソッド-(IBAction)ExecClick:(id)senderが動作するように定義しておきます。その中で次の処理を行います。

  • FileNodeのExecChildrenを呼び出します。これは右ペインのファイルパスがクリックされたとき、wkTreeSave(配列)にファイルパスをsaveするためです。あとでCallChildrenのコードを載せます。
    [mmFileNode CallChildren:mcBaseFolderPath];
  • このあと、reloadDataではなく、次のrearrangeObjectsメソッドを実行します。
    [xbTreeCont rearrangeObjects];

▶︎FileNode.m

FileNodeは次のようにします。

  • ファイルパスを強制的に作成・saveするために次のやうなメソッドを作成します。filePathはMesaClipが使うディレクトリ(フォルダ)です。
    -(void)CallChildren:(NSString*)filePath
    {
        path = filePath;
        [self ExecChildren];
    }
  • ① MesaClipが使うディレクトリかチェックし、そうだったら初期化します。
    NSArray *wkArray = [fileManager contentsOfDirectoryAtPath:path error:&error];
    NoOfFiles = [wkArray count]; //取得したディレクトリのファイル数
    wkTreeArray = [[NSMutableArray alloc] initWithCapacity:NoOfFiles];//表要素初期化
     if ([path isEqualTo:mcBaseFolderPath])
            {
                inxTree = 0;
                wkTreeSave = [NSMutableArray new]; 
                wkTreeSave[inxTree] = path; 
                inxTree = inxTree + 1;  
            }   ② ExecChildrenの中でツリー構造を作っている箇所でwkTreeSave(配列)にファイルパスをsaveします。saveする箇所は合計2ヶ所あります。
    FileNode *item = [[FileNode alloc] initWithPath:filePath];
    [wkTreeArray addObject:item]; //wkTreeArrayに追加。
    [self ExecResetFile:filePath item:item directoryBOOL:directoryBOOL];//
     wkTreeSave[inxTree] = filePath;   
     inxTree = inxTree + 1;

▶︎備考

  • 選択行の解除は、NSOutlineViewをNSTableViewで再定義し、NSOutlineViewに接続する。[xbTreeView deselectRow:行番号];
  • 逆に、行の選択表示は、[xbTreeView selectRowIndexes:[NSIndexSet indexSetWithIndex:mcClickedRow] byExtendingSelection:NO];
  • 行の選択表示は、[xbTreeCont rearrangeObjects];のあとに行うこと。
  • 上記の中でポイントになるのは、 IBOutlet NSTreeController *xbTreeCont;。オブジェクトをこのように再定義することで違うメソッドを実行できることを覚えておくこと。

Categories: Obj.C, 技術

Tagged as: ,