我有一個應用程序需要按組顯示大量數據。我在表格的角落視圖中放置了一個組選擇菜單,以允許用戶選擇要查看的組。可可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]
是基於表格視圖還是基於單元格? – Willeke
通常,如果您有一個表綁定到控制器,並且您想要更改表中顯示的內容,那麼您可以更改控制器的內容......您不會拆除視圖的綁定。如果您希望將不同的數據集合綁定並以不同的方式顯示,您可能需要通過動態顯示不同的視圖來處理它,而不是使用重建的綁定來查看相同的視圖。 – stevesliva
所以,是的,它有點兒把雞蛋重新拼成一個煎蛋卷,所以使用我認爲是要走的幾個標籤的標籤視圖(少選項卡)。 – slashlos