2011-12-13 44 views
9

Có bất kỳ loại ID có thể được sử dụng và thiết lập trong .nib/.xib qua Xcode có thể được truy vấn trong thời gian chạy để xác định một trường hợp xem cụ thể từ mã?ID độc đáo trên NSViews

Đặc biệt khi có nhiều bản sao của lớp con NSView cùng trong giao diện của chúng tôi như thế nào chúng ta có thể nói cái nào chúng tôi hiện đang xem xét?

Trả lời

9

Generic NSView đối tượng không được đặt thuộc tính tag trong Trình tạo giao diện. Phương pháp tag trên NSView là phương pháp chỉ đọc và chỉ có thể được triển khai trong các lớp con của NSView. NSView không triển khai phương thức setTag:.

Tôi nghi ngờ các câu trả lời khác đang đề cập đến các trường hợp của NSControl xác định phương thức -setTag: và có trường Trình tạo giao diện để cho phép bạn đặt thẻ.

Điều bạn có thể thực hiện với chế độ xem chung là sử dụng thuộc tính thời gian chạy do người dùng xác định. Điều này cho phép bạn đặt trước các giá trị của thuộc tính trong đối tượng xem của bạn. Vì vậy, nếu tầm nhìn của bạn được xác định một tài sản như sau:

@property (strong) NSNumber* viewID; 

Sau đó, trong phần người dùng định nghĩa các thuộc tính của thanh tra nhận dạng trong giao diện Builder, bạn có thể thêm một tài sản với các keypath viewID, loại Number và giá trị 123 .

Trong phương pháp xem của bạn -awakeFromNib, sau đó bạn có thể truy cập giá trị của tài sản. Bạn sẽ thấy rằng trong ví dụ trên, thuộc tính viewID của chế độ xem của bạn sẽ được đặt trước thành 123.

+0

Điều đó thật tuyệt vời, cảm ơn gợi ý! Tôi sẽ thử xem. Than ôi, không có gì được xác định trước trong vani ca cao NSView có thể được sử dụng nhưng tôi đoán tôi vẫn còn suy nghĩ quá nhiều trong một cách PowerPlant/MFC ;-) – Jay

+1

Trả lời dưới đây không làm việc cho một cái nhìn chung chung. Đơn giản chỉ cần thiết lập Identifer trong xib và truy cập nó theo lập trình với view.identifier – Colin

+0

Bất kỳ ý tưởng logic đằng sau thẻ được đọc chỉ trong NSView là gì? – Mercurial

10

Trong bộ dựng giao diện, có một cách để đặt "số nhận dạng" của NSView. Trong trường hợp này, tôi sẽ sử dụng mã định danh "54321" làm chuỗi định danh.

NSView Tuân thủ các NSUserInterfaceItemIdentification Protocol, mà là một định danh duy nhất như một NSString. Bạn có thể đi qua hệ thống phân cấp khung nhìn và tìm NSView với mã định danh đó.

Vì vậy, để xây dựng về bài đăng này về việc nhận danh sách các NSViews, Get ALL views and subview of NSWindow, sau đó bạn có thể tìm thấy những NSView với nhận dạng bạn muốn:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSView *viewToFind = [self viewWithIdentifier:@"54321"]; 
} 

- (NSView *)viewWithIdentifier:(NSString *)identifier 
{ 
    NSArray *subviews = [self allSubviewsInView:self.window.contentView]; 

    for (NSView *view in subviews) { 
     if ([view.identifier isEqualToString:identifier]) { 
      return view; 
     } 
    } 

    return nil; 
} 

- (NSMutableArray *)allSubviewsInView:(NSView *)parentView { 

    NSMutableArray *allSubviews  = [[NSMutableArray alloc] initWithObjects: nil]; 
    NSMutableArray *currentSubviews = [[NSMutableArray alloc] initWithObjects: parentView, nil]; 
    NSMutableArray *newSubviews  = [[NSMutableArray alloc] initWithObjects: parentView, nil]; 

    while (newSubviews.count) { 
     [newSubviews removeAllObjects]; 

     for (NSView *view in currentSubviews) { 
      for (NSView *subview in view.subviews) [newSubviews addObject:subview]; 
     } 

     [currentSubviews removeAllObjects]; 
     [currentSubviews addObjectsFromArray:newSubviews]; 
     [allSubviews addObjectsFromArray:newSubviews]; 

    } 

    for (NSView *view in allSubviews) { 
     NSLog(@"View: %@, tag: %ld, identifier: %@", view, view.tag, view.identifier); 
    } 

    return allSubviews; 
} 

Hoặc, kể từ khi bạn đang sử dụng một lớp con NSView, bạn có thể đặt "thẻ" của mỗi chế độ xem khi chạy. (Hoặc, bạn có thể đặt số nhận dạng tại thời gian chạy.) Điều tuyệt vời về thẻ, là có một hàm được tạo sẵn để tìm một chế độ xem với một thẻ cụ thể.

// set the tag 
NSInteger tagValue = 12345; 
[self.myButton setTag:tagValue]; 

// find it 
NSButton *myButton = [self.window.contentView viewWithTag:12345]; 
Các vấn đề liên quan