2009-02-02 37 views
6

Điều gì được coi là cách tốt nhất để xử lý nhiều NSTableViews mà không sử dụng Cocoa Bindings?Cách tốt nhất để xử lý nhiều NSTableView (s)

Trong ứng dụng của mình, tôi có hai NSTableViews đủ liên quan chặt chẽ đến mức tôi đang sử dụng cùng một đối tượng với vai trò là delegate và DataSource cho cả hai. Vấn đề là cả hai tableViews đều gọi các phương thức tương tự. Tôi hiện đang phân biệt đối xử giữa hai tableViews trên cơ sở của NSControl -tag.

Tôi càng thâm nhập sâu vào mã này, việc sử dụng giao diện -tag càng tệ hơn. Tôi cuối cùng tạo ra phần lớn mã trùng lặp để phân biệt giữa tableViews trong mỗi phương thức delegate/DataSource. Mã kết thúc lên được định hướng không đối tượng rõ ràng.

Tôi có thể tạo một đối tượng riêng để xử lý một hoặc bảng khác, nhưng việc tạo đối tượng đã nói sẽ là cấu trúc nhân tạo chỉ nhằm cung cấp một đại biểu/nguồn dữ liệu riêng biệt.

Có phải tất cả mọi người chỉ sử dụng Bindings Cocoa ngay bây giờ? Tôi tránh Bindings vì tôi muốn trau dồi kỹ năng Cocoa của mình về các kỹ thuật có thể chuyển đổi giữa Mac OS và iPhone.

Trả lời

10

Mọi phương thức đại biểu/dataSource cho NSTableView chuyển thể hiện của NSTableView gọi nó là tham số đầu tiên (ngoại trừ tham số vượt qua đối tượng NSNotification, trong trường hợp này là object NSNotification). Một số ví dụ bao gồm:

- (int)numberOfRowsForTableView:(NSTableView*)aTableView;

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn*)aTableColumn row:(NSInteger)rowIndex

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification

Nếu bạn đang sử dụng một đối tượng điều khiển như một nguồn đại biểu/dữ liệu cho nhiều bảng, bạn chỉ có thể sử dụng tham số đó để phân biệt giữa chúng.

+0

Tôi hiện đang sử dụng phương pháp này NSControl -tag, gửi đến các lập luận tableView mà bạn chỉ ra, để phân biệt giữa tableViews . Sử dụng -tag dường như dứt khoát hơn một chút so với sử dụng chính đối số tableView, vì tôi sẽ phải so sánh đối số với một cái gì đó để xác định tableView. –

+2

Vâng, thông thường bạn cũng sẽ có các cửa hàng được thiết lập trong IB từ bộ điều khiển của bạn đến chế độ xem bảng, vì vậy bạn chỉ có thể so sánh số lượt xem trong bảng với các cửa hàng của bạn để xác định điểm nào. –

+1

Đây là cách tốt nhất để xử lý nó. Các phương thức ủy quyền trong Cocoa luôn bao gồm đối tượng gửi cho cùng lý do này. Nếu bạn đang lặp lại chính mình, hãy cố gắng đưa mã đó vào một phương pháp riêng. –

2

Có vẻ như bạn nên sử dụng một đối tượng đại biểu khác cho mỗi chế độ xem nhưng cùng một nguồn dữ liệu. Nói cách khác, một mô hình duy nhất cho các đối tượng khác nhau và các đối tượng điều khiển.

Tôi không nghĩ đây là sự phân biệt nhân tạo bởi vì các đối tượng có các mục đích khác nhau, nhưng bạn muốn sử dụng cùng một dữ liệu. Quy tắc lớn hơn bạn đang vi phạm bây giờ là mỗi đối tượng nên có một mục đích duy nhất. Mục đích của mỗi đối tượng có thể là truy xuất và hiển thị dữ liệu theo một cách cụ thể.

Chúc may mắn!

3

cho phương pháp:

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification 

bạn có thể sử dụng:

NSTableView *theTable = (NSTableView *)[aNotification object]; 
if(theTable==listeDesMots) 
... 
+0

NSTabView => NSTableView –

+0

Cảm ơn, đã chỉnh sửa.Và cũng là '(NSTableView *)' cast, để tránh cảnh báo biên dịch. – tontonCD

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