2011-11-11 21 views
16

Có ai đã tìm thấy một ví dụ rõ ràng, ngắn gọn hoặc hướng dẫn về cách triển khai danh sách nguồn bằng cách sử dụng NSOutlineView dựa trên chế độ xem được giới thiệu trong Lion không? Tôi đã xem xét dự án ví dụ của Apple, nhưng không có bất kỳ ý nghĩa nào về hướng hoặc giải thích, tôi thấy khó nắm bắt được khái niệm chính xác cách họ làm việc.Ví dụ về cách triển khai danh sách nguồn dựa trên chế độ xem (NSOutlineView) bằng cách sử dụng Bindings Cocoa?

Tôi biết cách sử dụng PXSourceList tuyệt vời làm dự phòng, nhưng thực sự muốn bắt đầu sử dụng danh sách nguồn dựa trên chế độ xem thay vì nếu có thể.

Trả lời

29

Bạn đã gắn thẻ thẻ này với thẻ liên kết cacao, vì vậy, tôi giả sử bạn có nghĩa là "có gắn kết". Tôi đã đưa ra một ví dụ nhanh. Bắt đầu từ một mẫu ứng dụng Cocoa không dựa trên tài liệu mới trong Xcode. Gọi nó là bất cứ điều gì bạn thích. Đầu tiên tôi thêm một số mã để làm cho một số dữ liệu giả mạo để ràng buộc với. Đây là những gì tiêu đề appdelegate của tôi trông giống như:

#import <Cocoa/Cocoa.h> 

@interface SOAppDelegate : NSObject <NSApplicationDelegate> 

@property (assign) IBOutlet NSWindow *window; 

@property (retain) id dataModel; 

@end 

Và đây là những gì thực hiện appdelegate của tôi trông giống như:

#import "SOAppDelegate.h" 

@implementation SOAppDelegate 

@synthesize window = _window; 
@synthesize dataModel = _dataModel; 

- (void)dealloc 
{ 
    [_dataModel release]; 
    [super dealloc]; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 

    // Make some fake data for our source list. 
    NSMutableDictionary* item1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 1", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.1", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.1", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.2", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item3 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 3", @"itemName", [NSMutableArray array], @"children", nil]; 

    [[item2_2 objectForKey: @"children"] addObject: item2_2_1]; 
    [[item2_2 objectForKey: @"children"] addObject: item2_2_2]; 

    [[item2 objectForKey: @"children"] addObject: item2_1]; 
    [[item2 objectForKey: @"children"] addObject: item2_2]; 

    NSMutableArray* dataModel = [NSMutableArray array]; 

    [dataModel addObject: item1]; 
    [dataModel addObject: item2]; 
    [dataModel addObject: item3]; 

    self.dataModel = dataModel; 
} 

@end 

Không có ý nghĩa đặc biệt đối với các cấu trúc dữ liệu giả Tôi tạo ra, tôi chỉ muốn thể hiện một cái gì đó với một vài phụ cấp, vv Điều duy nhất quan trọng là các đường dẫn chính bạn chỉ định trong các ràng buộc trong Interface Builder xếp hàng với các khóa trong dữ liệu của bạn (dữ liệu giả trong trường hợp này.)

Sau đó chọn MainMenu.xib fil e. Trong trình soạn thảo IB, thực hiện các bước sau:

  1. Sử dụng Thư viện đối tượng (Ctrl-Cmd-Opt-3) để thêm NSTreeController vào .xib.
  2. Chọn NSTreeController, và sử dụng các thuộc tính Inspector (Cmd-Opt-4) thiết chính Paths> Trẻ em-children (ví dụ này; Đối với dữ liệu của bạn, điều này nên được bất cứ điều gì trả về mảng các đối tượng trẻ em.)
  3. với NSTreeController vẫn được chọn, sử dụng Bindings Inspector (Cmd-Opt-7) để ràng buộc Content mảng đến appdelegate, với một con đường chính Mô hình dataModel
  4. Tiếp theo sử dụng Object Library (Ctrl-Cmd- Chọn-3) để thêm NSOutlineView vào .xib của bạn.
  5. Sắp xếp sự hài lòng của bạn bên trong cửa sổ (thường là toàn bộ chiều cao của cửa sổ, tuôn ra phía bên trái của cửa sổ)
  6. Chọn NSOutlineView (lưu ý rằng lần đầu tiên bạn nhấp vào nó, bạn có thể đã chọn NSScrollView có chứa nó, click vào nó lần thứ hai và bạn sẽ được khoan xuống chính NSOutlineView Lưu ý rằng đây là MUCH dễ dàng hơn nếu bạn mở rộng vùng bên trái của trình soạn thảo IB, nơi tất cả các đối tượng là - - điều này cho phép bạn xem các đối tượng dưới dạng cây và điều hướng và chọn chúng theo cách đó.)
  7. Sử dụng thuộc tính Inspector (Cmd-Opt-4) thiết lập các NSOutlineView:
    • Content Chế độ: View Based
    • Cột: 1
    • Highlight: Source List
  8. Sử dụng Thanh tra Bindings (Cmd-Opt-7) liên kết "Co ntent "to" Tree Controller ", Controller Key: arrangObjects (Đây là nơi mà hành vi của NSTableView/NSOutlineViews dựa trên View bắt đầu phân kỳ từ những cái dựa trên NSCell)
  9. Trong danh sách đối tượng (được đề cập trong # 6), mở rộng xem hệ thống phân cấp của NSOutlineView và chọn Static Text - Table View Cell.
  10. Sử dụng Bindings Inspector (Cmd-Opt-7) bind Value-Table Cell View, Kiểu đường chính: objectValue.itemName (Tôi đã sử dụng itemName trong các dữ liệu giả, bạn sẽ muốn sử dụng bất cứ chìa khóa tương ứng với tên của bạn các mục dữ liệu)

Lưu. Chạy. Bạn sẽ thấy một danh sách nguồn, và một khi bạn đã mở rộng các nút với trẻ em, bạn có thể thấy một cái gì đó như thế này:

enter image description here

Nếu bạn đang ở trong chương trình của Apple phát triển, bạn nên có khả năng truy cập số WWDC 2011 Videos. Có một đặc biệt dành riêng để làm việc với NSTableView dựa trên View (và NSOutlineView) và nó bao gồm phạm vi bảo hiểm khá kỹ lưỡng về các ràng buộc.

Hy vọng điều đó sẽ hữu ích!

+1

FYI video WWDC 2011 là phiên 120 có tiêu đề View Based NSTableView. – jemeshsu

+1

Đối với những người sử dụng: cũng xem xét: http://stackoverflow.com/questions/7095703/binding-view-based-nsoutlineview-to-core-data – bijan

+0

Có phải cách này cũng có thể chạy trên Leopard và Snow Leopard không? – arufian

Các vấn đề liên quan