2013-08-30 29 views
9

Tôi có một ứng dụng đơn giản liệt kê một số kiểu máy trong một số NSTableView.Thêm cột có lập trình (với các ràng buộc) vào NSTableView dựa trên chế độ xem?

Bảng này là một bảng dựa trên chế độ xem hoàn toàn tiêu chuẩn với một vài cột và được điền thông qua một liên kết sử dụng NSArrayController. Tất cả được thiết lập trong Interface Builder, và nó hoạt động như mong đợi.

Bây giờ, tôi muốn thêm một số cột khác theo lập trình và có các cột mới này liên kết với nhiều đường phím khác nhau trong các mô hình. Và ở đó, tôi bị mắc kẹt.

Để đơn giản, giả sử thiết lập này:

  1. Các đối tượng mẫu là những vật thể đơn giản chỉ với một tài sản NSString duy nhất: name
  2. Các appdelegate có một tài sản NSArray (models) nắm giữ một số mẫu trường hợp.
  3. NSArrayController's content được liên kết với mảng của ứng dụng là models.
  4. Số content của NSTableView được liên kết với bộ điều khiển mảng arrangedObjects.
  5. cột đầu tiên của bảng là ràng buộc (trong IB) để hiển thị các name bất động sản, tức là cột → bảng di động xem → văn bản tĩnh bảng xem tế bào → giá trị được ràng buộc với cái nhìn di động của bảng objectValue.name

Đây là, theo như tôi biết, đơn giản và theo sách, và nó hoạt động như một sự quyến rũ.

Nhưng ... làm cách nào để thêm nhiều cột hơn?

Để thêm một cột programatically (để giữ cho nó đơn giản, chúng ta hãy chỉ nói cột mới này nên cũng chỉ hiển thị name tài sản, giống như cột đó là đã có), tôi tưởng tượng tôi muốn làm một cái gì đó như thế này trong các đại biểu ứng dụng:

NSTableColumn* newColumn = [[NSTableColumn alloc] initWithIdentifier:@"newColumn"]; 

// do binding magic somehow 
// [[newColumn dataCell] bind:NSValueBinding toObject:??? withKeyPath:??? options:nil]; 

[self.table addColumn:newColumn]; // the table's connected with an IBOutlet 

tôi đã thử rất nhiều sự kết hợp của ràng buộc từ/đến các tế bào dữ liệu, bảng, cột, bộ điều khiển mảng, mảng riêng của mình, cũng như tất cả các cách thức của keypaths, nhưng không có gì hiệu quả. Cột mới được thêm vào tốt, nhưng nó không bao giờ được điền.

Tôi tưởng tượng rằng cá thể NSTableColumn cơ bản mà tôi tạo là dựa trên ô, không dựa trên chế độ xem và điều đó gây ra sự cố. Tuy nhiên, tôi không có ý tưởng làm thế nào để tiến hành từ đây, và các tài liệu không bao giờ nói về các cột ràng buộc đã được thêm vào theo chương trình.

Trong trường hợp này, tất cả những gì tôi muốn là một cột văn bản đơn giản, ràng buộc với mô hình, giống như mô hình tôi có thể dễ dàng thiết lập IB.

Tôi có thể làm tất cả điều này bằng cách triển khai NSTableViewDataSource và "thủ công" cho bảng, nhưng tôi đã có mọi thứ khác được thiết lập với các liên kết đã có.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

4

Hãy thử như thế này: -

NSString *akey = @"keyValue"; 
NSString *keypath = [NSString stringWithFormat:@"arrangedObjects.%@",akey]; 
NSTableColumn *tableColumn=[[NSTableColumn alloc]initWithIdentifier:@"newColumn"]; 

[tableView addTableColumn:tableColumn]; 
[tableColumn bind:NSValueBinding toObject:yourArrayController withKeyPath:keypath options:nil]; 
NSMutableDictionary *dc=[NSMutableDictionary dictionary]; 
[dc setObject:@"textValue" forKey:@"keyValue"]; 
[yourmutableArray addObject:dc]; 
[self setYourmutableArray:yourmutableArray]; 

Xin lưu ý: - mảng có thể thay đổi bạn nên liên kết với arraycontroller sau đó chỉ nó sẽ cư dữ liệu

+0

Xin lỗi, không hoạt động; thử nó. Ràng buộc cột chỉ hoạt động cho các bảng dựa trên ô. Không phải bảng dựa trên chế độ xem. – Flambino

2

Bạn cần phải liên kết với subviews của NSTableCellView cột bằng cách sử dụng này phương pháp đại biểu:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    // Get cell view - NSTableCellView 
    // This can be a prototype loaded from the table view or from another nib 
    // see : - registerNib:forIdentifier: 
    NSView *cellView = [tableView makeViewWithIdentifier:@"Cell1" owner:[tableView delegate]]; 

    // - subViewWithIdentifier is a simple category method that searches -subviews 
    NSView *subView = [cellView subViewWithIdentifier:@"TextField1"]; 
    [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.name" options: nil]; 

    subView = [cellView subViewWithIdentifier:@"TextField2"]; 
    [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.address" options: nil]; 

    return cellView; 
} 

NSView loại phương pháp:

- (NSView *)subViewWithIdentifier:(NSString *)theIdentifier 
{ 
    __block NSView *subView = nil; 
    [[self subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
#pragma unused(idx) 
     if ([[obj identifier] isEqualToString:theIdentifier]) { 
      subView = obj; 
      *stop = YES; 
     } 
    }]; 
    return subView; 
} 
Các vấn đề liên quan