2009-04-10 31 views
7

Tôi đang cố gắng nắm bắt được mức độ khó khăn khi sử dụng NSPopUpButton. Đó là bởi xa và đi các yếu tố người dùng khó khăn nhất để chương trình trong ca cao (ít nhất là xa như tôi đang tìm kiếm nó).NSPopUpButton, Bindings và rút ngắn tuổi thọ

Các trường hợp sử dụng tôi có trong tâm trí như sau:

  • Tôi có một lớp được gọi là Cảng đại diện cho một cổng nối tiếp.
  • Trong số các thuộc tính là trường tên.
  • Trong NSPopUpButton tôi muốn hiển thị trường tên cho mỗi cổng.
  • Khi người dùng chọn một cổng cụ thể, nó được đánh dấu trong cửa sổ bật lên với dấu chọn như mong đợi
  • Khi người dùng sau đó truy cập nút kết nối, tôi có thể xác định xem các cổng nào từ Mảng được chọn.
  • Tôi muốn đạt được điều này bằng cách sử dụng bindings như tôi nghĩ rằng một khi tôi nhận được đầu của tôi xung quanh nó, nó sẽ là giải pháp thanh lịch hơn.

Vì vậy trong AppController.h của tôi, tôi đang mong đợi hai thuộc tính mà tôi có lẽ có thể tạo tài sản và tổng hợp:

NSMutableArray *allPorts; 
Port *currentlySelectedPort; 

và một hành động trong .m tôi:

-(void)didSelectConnect:(id)sender{ 
    NSLog(@"Selected port name is:%@",[currentlySelectedPort name]); 
} 

trong Port.h Tôi có

NSString *name; 
NSString *baudRate; 
... etc ... 

I ha đã tạo ra một dự án đơn giản chỉ chứa một cửa sổ pop up (và một nhãn) và sau nhiều bài viết khác nhau, tôi đã quản lý một NSMutableArray với các phần tử mà sau đó tôi sử dụng một ArrayController để hiển thị các giá trị và sau đó chọn giá trị của một nhãn (sử dụng bộ điều khiển đối tượng). Tuy nhiên, nhiều như thế này là thông minh nó không phù hợp với trường hợp sử dụng tôi đang cố gắng thực hiện. Vì vậy, tôi rẽ vào đây để giúp đỡ

M

+0

Bạn có thể muốn xem xét bắt đầu mà không cần sử dụng các ràng buộc. Bạn sẽ viết nhiều mã hơn, nhưng bạn bắt buộc phải hiểu mã đó (và tất cả các công nghệ cơ bản đằng sau các ràng buộc như KVO) trước khi bạn thực sự có thể tạo các ràng buộc làm việc cho bạn trong các ví dụ phức tạp. –

Trả lời

11

OK, ràng buộc với NSPopUpButton là một chút phức tạp vì có hai điều cần thiết: một ràng buộc cho các giá trị, và một ràng buộc mà một trong những giá trị được chọn . Điều gì làm cho nó thậm chí còn phức tạp hơn là có một vài cách hoàn toàn hợp pháp để làm điều đó, và cái nào bạn chọn hoàn toàn phụ thuộc vào cấu trúc chương trình của bạn và, ở mức độ nào đó, sở thích cá nhân.

Vì vậy, để có danh sách giá trị, bạn liên kết thuộc tính content. Trong trường hợp của bạn, bạn có thể liên kết điều này với khóa arrangedObjects của số NSArrayController. Trong thiết lập này, mỗi mục menu đại diện cho một đối tượng. Theo mặc định, tiêu đề của mục menu là chuỗi được trả về bằng cách gọi description trên mỗi mục trong mảng. Nếu bạn muốn sử dụng thuộc tính khác cho tiêu đề menu, bạn cũng có thể liên kết mảng contentValues. Chỉ cần chắc chắn con đường quan trọng bạn chỉ định cho contentValues có con đường quan trọng cho content là tiền tố của nó (ví dụ: bạn có thể sử dụng arrangedObjects cho contentarrangedObjects.name cho contentValues)

này sẽ cung cấp cho bạn các mục menu mà đại diện cho các đối tượng. Những gì bạn cần tiếp theo là một số cách để xác định một lựa chọn. Có ba ràng buộc khác nhau mà bạn có thể sử dụng: selectedIndex, selectedObjectselectedValue.Chúng đại diện, tương ứng, chỉ mục của đối tượng mảng mà người dùng đã chọn, giá trị đối tượng (một trong các đối tượng trong mảng content) và tiêu đề chuỗi của mục đã chọn (một trong các đối tượng trong mảng contentValues nếu bạn bị ràng buộc tài sản đó).

Vì vậy, trong trường hợp của bạn, bạn có thể ràng buộc selectedObject thành thuộc tính selectedSerialPort trên lớp điều khiển của bạn. Khi người dùng nhấp vào nút "Kết nối", bạn chỉ phải tham khảo thuộc tính selectedSerialPort.

6

Bạn có thể tải xuống sample Xcode project here. Cái này gần như tôi có thể nhận được để mô tả của bạn.

Điều quan trọng là xem xét các kết nối giữa bộ điều khiển mảng, AppController và hộp bật lên.

Về cơ bản, điều này chỉ thể hiện những gì Alex nói.

+0

Abizem, tôi rất thích chấp nhận câu trả lời là mã của bạn, với lời giải thích đã làm việc một điều trị! – Clokey

+0

Điều gì sẽ xảy ra nếu bạn không khởi tạo mảng allPorts cho đến awakeFromNib? Làm thế nào bạn sẽ nói với NSPopUpButton để tải lại các giá trị? – johnboiles

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