2016-09-20 93 views
0

我有一個應用程序需要按組顯示大量數據。我在表格的角落視圖中放置了一個組選擇菜單,以允許用戶選擇要查看的組。可可nstableview動態綁定 - 沒有IB

此表的列具有標識符fld#0..n和用於提取數據的關聯控制器。在目標類中,它將 - 使用綁定到視圖控制器的IBOutlet檢索組選擇,並使用它通過切換選擇要顯示的值。

所有的花花公子,直到我需要支持多個視圖/窗口實例。所以我想我會在運行時,改變?在表列和它的綁定中。迄今爲止,我只能通過IB完成這些工作,所以這是我第一次進入內臟並陷入困境。

我的角落視圖操作菜單(什麼用戶調用):

- (NSMenu *)menuForEvent:(NSEvent *)event 
{ 
    NSMenu * menu = [[[NSMenu alloc] init] autorelease]; 
    SEL action = @selector(cornerAction:); 
    NSMenuItem * item = nil; 
    int type = 0; 

    // We auto enable items as views present them 
    [menu setAutoenablesItems:YES]; 

    // TableView level column customizations 
    for (NSString * title in titles) 
    { 
     BOOL state = dataView.data == type; 

     item = [[NSMenuItem alloc] initWithTitle:title 
              action:action 
            keyEquivalent:@""]; 
     [item setRepresentedObject:dataView]; 
     [item setState:state]; 
     [item setEnabled:YES]; 
     [item setTag:type++]; 
     [item setTarget:dataView]; 
     [item setAction:action]; 
     [menu addItem:item]; 
     [item release]; 
    } 
    return menu; 
} 

,然後採取行動 - 但我需要弄清楚如何更新綁定失敗:

- (IBAction)cornerAction:(id)sender 
{ 
    // Configure which type of data to show, then columns' identifier and sort 
    self.data = (self == sender ? 0 : [sender tag]); 

    [super cornerAction:sender]; 

    for (NSUInteger itm=0; itm<self.fieldCount; itm++) 
    { 
     NSString * fld = [NSString stringWithFormat:@"fld%@%d", titles[data], itm]; 
     NSString * key = [NSString stringWithFormat:@"srt%@%d", titles[data], itm]; 
     NSSortDescriptor * srt = [NSSortDescriptor sortDescriptorWithKey:key ascending:YES]; 

     [cols[itm] setIdentifier:fld]; 
     [cols[itm] setSortDescriptorPrototype:srt]; 

     [cols[itm] bind:<#(nonnull NSString *)#> 
       toObject:<#(nonnull id)#> 
      withKeyPath:<#(nonnull NSString *)#> 
       options:<#(nullable NSDictionary<NSString *,id> *)#>] 
    } 

    [self reloadArray:YES]; 
} 

的cols [ ]是表列的數組,所以最後一行是將列的綁定更新到控制器(樹形控制器)到正確數據的起點。我更新了該類以刪除fld#placesholder列,並創建了fld#和srt#ivars的所有變體;這些基本上會返回潛在的伊娃。最後,所有訪問都是隻讀的。

我在想我現在需要做的就是更新綁定。我也覺得可能對標識符和排序描述符的列更改沒有必要?

無論如何,我試圖避免計劃-B這是訴諸標籤,實例化每個組的tableview - 或者也許有更好的方法呢?

UPDATE:假設我沿計劃-A繼續不應這項工作:爲COLS怙列標識符[0]是FLD0

 [cols[itm] bind: @"value" 
       toObject: treeController 
      withKeyPath: [NSString stringWithFormat:@"arrangedObjects.%@",fld] 
       options: nil] 
+0

是基於表格視圖還是基於單元格? – Willeke

+1

通常,如果您有一個表綁定到控制器,並且您想要更改表中顯示的內容,那麼您可以更改控制器的內容......您不會拆除視圖的綁定。如果您希望將不同的數據集合綁定並以不同的方式顯示,您可能需要通過動態顯示不同的視圖來處理它,而不是使用重建的綁定來查看相同的視圖。 – stevesliva

+0

所以,是的,它有點兒把雞蛋重新拼成一個煎蛋卷,所以使用我認爲是要走的幾個標籤的標籤視圖(少選項卡)。 – slashlos

回答

0

由於隱式高速緩存/對象克隆的最簡單的解決辦法是實例化表視圖。用戶界面保持一致,所以沒有用戶可見的變化,我需要,並且是一個模型向前推進其他類似的要求 - 如何通過單鏡頭/表視圖隱喻查看海量數據。