2008-12-09 20 views
5

Tôi cần giữ một cập nhật NSPathControl với đường dẫn hiện được chọn trong NSBrowser, nhưng tôi đang gặp khó khăn trong việc tìm ra cách nhận thông báo đường dẫn đã thay đổi từ NSBrowser. Cách lý tưởng để làm điều này chỉ là quan sát đường dẫn khóa đường dẫn trong NSBrowser, nhưng điều đó cho phép KVO chỉ có thể quan sát các phương thức set <key> trả về thông báo void và không cập nhật (setPath trả về giá trị thành công bool).Làm thế nào để giữ cho một NSPathControl được cập nhật với đường dẫn của ô đã chọn trong NSBrowser

Tôi cũng đã thử quan sát đường dẫn khóa đã chọn, nhưng tôi không nhận được thông báo khi lựa chọn có thay đổi.

Có cách nào khác thực sự rõ ràng để làm điều này mà tôi đang thiếu?

Trả lời

7

Courtesy of Rob Keniger qua tại Cocoa Dev:

bạn đã xem xét các ví dụ SimpleBrowser trong/Developer/Các ví dụ? Nó cho biết cách lấy vùng chọn hiện tại khi nó được thay đổi bởi người dùng, về cơ bản chỉ bằng cách thiết lập hành động của NSBrowser.

Đó thực sự là cách để làm điều đó. Chỉ cần triển khai một phương thức broswerClicked: (bao gồm ánh xạ nó trong trình tạo giao diện) với bất kỳ điều gì bạn muốn xảy ra mỗi khi lựa chọn thay đổi bên trong phương thức đó, ví dụ:

- (void)browserClicked:(id)browser { 
    self.pathToSelectedCell = [browser path]; // NSPathControl is bound to pathToSelectedCell 
} 
+3

Xin chào, đó là tôi :-) –

0

Tôi chỉ cần kiểm tra trong IB, và có vẻ như NSBrowser có một đường dẫn chỉ mục lựa chọn ràng buộc (một mảng các đối tượng NSIndexPath) mà bạn có thể có thể theo dõi với KVO. Thật kỳ lạ nhưng tôi không thấy bất kỳ đề cập nào về nó trong tài liệu, vì vậy bạn có thể cần phải làm một ít nghiên cứu để xem đó có phải là điều bạn nên hoặc không nên sử dụng, ngay cả khi nó có vẻ hoạt động. Nếu có, trong phương pháp quan sát KVO của bạn, bạn sẽ tìm thấy đường dẫn hiện tại của trình duyệt và chuyển đổi nó thành NSURL mà điều khiển đường dẫn có thể sử dụng.

Nếu điều đó không hoạt động, cũng có các phương thức ủy nhiệm - (BOOL)browser:(NSBrowser *)sender selectRow:(NSInteger)row inColumn:(NSInteger)column- (BOOL)browser:(NSBrowser *)sender selectCellWithString:(NSString *)title inColumn:(NSInteger)column.

+0

Đó phương pháp đại biểu tiếc là chỉ được gọi để đáp ứng với selectRow: inColumn: được gửi cho trình duyệt. Nếu tôi thiết lập một ràng buộc với đường dẫn chỉ mục lựa chọn thì các phương thức ủy nhiệm NSBrowser dường như không còn được gọi, làm cho nó vì vậy tôi không thể thiết lập trình duyệt của mình. –

0

Tính đến 10.6, người ta có thể tìm ra các mục được chọn, bằng cách sử dụng gọi lại delegate như sau:

- (NSIndexSet *)browser:(NSBrowser *)browser selectionIndexesForProposedSelection:(NSIndexSet *)proposedSelectionIndexes inColumn:(NSInteger)column 
{ 
    NSLog(@"New first item of the new selection is at index %@", [proposedSelectionIndexes firstIndex]); 
    // Do something with the selected index or indicies 
    return proposedSelectionIndexes; // Allow the selection to occur by not changing this 
} 
Các vấn đề liên quan