2009-08-28 31 views
12

Tôi biết một chút về mục tiêu-C và tôi đang làm việc trên một cuốn sách iPhone SDK (đến từ một cuốn sách Obj-C mà chỉ cần làm chương trình điều khiển). Nó cố gắng giải thích các đại biểu mặc dù nó đã được vội vã và không thực sự hiểu những gì nó đã cố gắng để truyền đạt. Tôi là một chút bối rối về những gì họ đang có và khi bạn sẽ sử dụng chúng.Ít bối rối về các đại biểu trong mục tiêu-C

Về cơ bản, họ cho biết họ là các lớp chịu trách nhiệm thực hiện một số việc thay mặt cho một đối tượng khác.

Bất cứ ai quan tâm đến việc xây dựng?

Cảm ơn!

+2

Tôi đã có một thời gian khó khăn với điều này khi tôi bắt đầu xem xét Cocoa. Bạn không cô đơn. – jergason

Trả lời

6

Cách tốt để hiểu đại biểu là thông qua ví dụ. Một ví dụ là UITableView (hoặc NSTableView, tùy thuộc vào việc chúng tôi đang nói chuyện với iPhone hay Mac OS). Dù bằng cách nào, chế độ xem bảng có delegatedataSource (cả hai đều hoạt động như các đối tượng phụ trợ cho người nhận).

Thay vì UITableView xử lý các sự kiện khi, ví dụ: một trong các hàng của nó được người dùng nhấn vào, thay vào đó, hãy nói với số delegate "Này! Tôi đã được nhấn vào hàng này và phần này, làm những gì bạn sẽ làm! ". Thông thường, delegate là Bộ điều khiển của một số loại, thực hiện phương pháp chính xác. Vì vậy, xem bảng (sau khi kiểm tra để xem nếu delegate thực sự có một định nghĩa cho phương pháp này) gửi một thông điệp như thế này:

[delegate tableView:self didSelectRowAtIndexPath:indexPath]; 

Kể từ điều khiển của bạn là đại biểu của bảng, và nó thực hiện rằng phương pháp, nó quyết định những gì làm. Khi phương thức hoàn thành (trong trường hợp này nó sẽ chỉ trả về void), sau đó thực hiện tiếp tục trên màn hình bảng.

Đại biểu là một khái niệm. Nó không phải là một tính năng ngôn ngữ của Objective-C. Thành viên delegate của UITableView giống như bất kỳ đối tượng nào khác. Mặc dù, các đại biểu thường là không phải được giữ lại, thay vào đó chúng được chỉ định (để tránh retain chu kỳ).

Chúng rất tiện dụng khi bạn bị treo chúng. Tôi đề nghị thực hành với các ví dụ như TableViews (NSTableView, như tôi đã nói trước đó, hoạt động theo cách tương tự, chỉ với các phương pháp khác nhau).

+0

Vì vậy, chúng là một lớp mà một đối tượng gọi khi một cái gì đó được thực hiện cho chính nó. Và tùy thuộc vào những gì đã được thực hiện cho chính nó nó gọi một phương pháp nhất định từ lớp của đại biểu. Chính xác? Đây có phải là cách thích hợp để tạo lớp đại biểu hay chỉ là một lớp bình thường khác với các phương thức mà các lớp khác xảy ra để kêu gọi? –

+1

Về mặt kỹ thuật, đại biểu là một đối tượng. Bạn có thể có năm mươi trường hợp của một đối tượng thực hiện một số phương thức đại biểu, nhưng chỉ có cá thể được thiết lập là đại biểu có các phương thức được gọi. Cách thích hợp để tạo đại biểu là xác định giao thức, xác định một tập hợp các phương thức phải/có thể được triển khai. – johnw188

+1

@ Avizz: Bạn nói đúng, một đại biểu có thể là bất kỳ loại đối tượng nào bạn muốn. Mặc dù thông thường nó sẽ là một trong đó 'phù hợp với một giao thức'. Nếu một đối tượng phù hợp với một giao thức nhất định, về cơ bản nó có nghĩa là "Tôi hứa rằng tôi đã thực hiện mọi thứ cần thiết của tôi trong giao thức đã cho." Bằng cách này, khi một đối tượng gửi tin nhắn đến một đại biểu, họ tin tưởng người được ủy quyền biết phải làm gì – jbrennan

7

Giả sử bạn muốn giới thiệu cho người dùng một cảnh báo và bạn muốn phương thức chạy khi người dùng chạm vào một trong các nút. Vấn đề là, làm thế nào để bạn biết những gì phương pháp để gọi, trên đối tượng, khi ai đó chạm vào một nút?

Để một lớp là đại biểu, bạn phải khai báo nó như vậy. Trong ví dụ trên, giả sử bạn có đối tượng ApplicationController điều khiển luồng ứng dụng của bạn. Trong tuyên bố, chúng tôi sẽ nói

@interface ApplicationController : NSObject <UIAlertViewDelegate> 

Điều này cho trình biên dịch rằng ApplicationController sẽ thực hiện một số phương thức trong giao thức UIAlertViewDelegate. Chúng tôi xem giao thức đó trong tài liệu của chúng tôi và xem danh sách các phương pháp. Vì chúng tôi muốn làm điều gì đó khi nhấn nút, chúng tôi thấy:

alertView:clickedButtonAtIndex: - Được gửi đến đại biểu khi người dùng nhấp vào nút trên chế độ xem cảnh báo. Phương pháp này là tùy chọn.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

Vì vậy, nếu chúng ta thực hiện một phương pháp trong ApplicationController gọi alertView:clickedButtonAtIndex, tạo một đối tượng ApplicationController, và sau đó thiết lập đối tượng đó là đại biểu của một cảnh báo chúng tôi cho thấy, tất cả mọi thứ được thiết lập. Ngay sau khi ai đó nhấn một nút trên cảnh báo, phương thức alertView:clickedButtonAtIndex sẽ được gọi, chuyển qua chế độ xem cảnh báo và chỉ mục của nút được nhấn.

Điều này cho phép bạn làm bất cứ điều gì bạn muốn với thông tin đó. Một tuyên bố đơn giản trường hợp:

if(buttonIndex == 0) { 
    _myString = @"Pressed the button"; 
} else { 
    _myString = @"Pressed the other button"; 
} 

Các tài liệu tham khảo Objective-C là rất, rất tốt, và tất cả các giao thức đại biểu là khá tự giải thích.

+0

biểu tượng tại nghĩa là gì? –

+1

Nó phụ thuộc vào cái bạn đang đề cập đến. Bạn có thể định nghĩa các chuỗi tại chỗ bằng cách nói @ "string here", đây là một điều cú pháp c mục tiêu. Nếu không, @interface là một khai báo lớp. Rất nhiều mục tiêu cụ thể c bắt đầu bằng @, vì nó không bao giờ được sử dụng trong định danh C/C++. Nó cho phép các nhà phát triển của mục tiêu c để đảm bảo không có sự nhầm lẫn về việc liệu một cái gì đó là từ C/C++ hoặc mục tiêu c – johnw188

20

Hãy suy nghĩ của các đại biểu là đảo ngược hướng phụ thuộc. Trong hầu hết các khung công tác, các máy khách sẽ tiêm các phụ thuộc cần thiết vào các cá thể, thường là trong các hàm tạo hoặc bởi các bộ định tuyến.

Ca cao làm ngược lại; trường hợp thay vào đó yêu cầu dữ liệu khi nào và nếu cần.

Có bốn loại chính của phương pháp đại biểu:

  • có điều kiện trước khi - Tín hiệu điều gì đó sắp xảy ra, nhưng các đại biểu có thể hủy bỏ. Tên luôn bao gồm từ nên.
    Ví dụ: searchBarShouldEndEditing:.
  • Vô điều kiện trước - Tín hiệu sắp xảy ra. Tên luôn bao gồm từ sẽ.
    Ví dụ: applicationWillTerminate:.
  • Vô điều kiện sau - Tín hiệu đã xảy ra. Tên luôn bao gồm từ đã làm.
    Ví dụ: applicationDidFinishLaunching:.
  • Tùy biến - Yêu cầu thông tin về cách hoạt động. Tên bao gồm thông tin được yêu cầu.
    Ví dụ tableView:viewForHeaderInSection:.

Tất cả các phương thức ủy quyền luôn có người gửi là một trong các đối số. Bất kỳ phương thức ủy nhiệm nào cũng có thể có một giá trị trả về làm thay đổi cách người gửi hoạt động.

+1

Bằng cách giải thích tốt nhất trong số những câu trả lời, imho –

2

Một đại biểu (có nghĩa là đại diện) là một lớp (đối tượng) muốn đại diện cho (kế thừa từ) một lớp không liên quan khác.Đối tượng delegate có thể kế thừa từ một lớp không liên quan bằng cách "tuân thủ" (có một số triển khai) các phương thức giao thức yêu cầu của lớp không liên quan, cho biết lớp ngoài là đối tượng này bây giờ có khả năng khai thác thông tin cơ bản nhất của nó một cách thích hợp.

Bạn sử dụng thừa kế khi bạn muốn liên quan lớp học để chia sẻ phương pháp. Bạn sử dụng đại biểu khi bạn muốn không liên quan các lớp học để chia sẻ phương pháp. Cách tiếp cận ủy nhiệm cho phép một đối tượng từ một lớp kế thừa các phương thức từ một lớp không liên quan khác. "Đối tượng đại diện", hoặc "đối tượng đại diện", là đối tượng kế thừa từ một lớp nước ngoài; nó được chỉ định như là một đại diện, một đại biểu, của lớp từ xa đó, để khi bạn gán một đối tượng làm đại biểu cho một lớp, bạn cũng cho phép nó đại diện cho lớp đó, mặc dù nó không kế thừa từ lớp đó . (Nếu nó được kế thừa từ lớp, thì bạn sẽ không cần phải thiết lập nó như là một đại biểu của lớp đó, nó sẽ có quyền truy cập vào các phương thức của lớp. Nhưng bạn muốn đối tượng không liên quan này kế thừa một số phương thức từ lớp, và trả về một số thông tin về lớp người gửi của nó, vì vậy bạn làm cho nó trở thành đại diện của lớp đó mặc dù nó kế thừa từ một nhóm các lớp khác.) Về cơ bản, nó cho phép một lớp không liên quan kế thừa từ một lớp không liên quan khác. tối thiểu các biến chứng cho dòng thừa kế cơ bản của nó.

Bạn sử dụng hệ thống đại biểu khi bạn muốn một đối tượng thực thi mã từ một lớp riêng biệt. Ví dụ: as described here, khi bạn nhấn Enter trong trường văn bản, trường văn bản thực sự không biết phải làm gì với thông tin đó. Những gì nó làm là nhìn vào lớp của đối tượng delegate (chẳng hạn như bộ điều khiển cửa sổ của tài liệu hoặc tài liệu) và sử dụng phương thức liên quan của lớp đó phù hợp với phương thức tương ứng của trường text được tìm thấy trong giao thức ủy nhiệm trường văn bản của nó, giống như textFieldShouldReturn. Vì vậy, trong trường hợp này, bạn đặt trình điều khiển cửa sổ hoặc tài liệu làm đại biểu của trường văn bản, bởi vì trường văn bản cần lớp đó để biểu diễn thông tin được cung cấp.

Class A cần có một phương pháp từ Class B, nhưng Class A không kế thừa từ lớp B. Đầu tiên, hãy nói với trình biên dịch rằng Class A phù hợp với các giao thức Lớp B:

@interface ClassA : NSObject <ClassBDelegateProtocol> 

Trong Documentation Apple, mỗi tham chiếu lớp hiển thị ở trên cùng, "Kế thừa từ" và "Phù hợp với". Ví dụ: NSDocumentController được kế thừa từ NSObject và phù hợp với NSUserInterfaceValidations, NSCodingNSObject(NSObject). Các sự phù hợp để NSCoding là từ việc khai báo giao diện trong NSDocumentController.h

@interface NSDocumentController : NSObject <NSCoding> 

NSUserInterfaceValidations từ khai báo phương thức trong NSDocumentController.h

-(BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item; 

cùng với #import

#import <AppKit/NSUserInterfaceValidation.h> 

Vì vậy, trong khi NSDocumentController được kế thừa từ NSObject, nó cũng muốn một số trợ giúp từNSCodingNSUserInterfaceValidation. Và nó được giúp đỡ từ các lớp học nước ngoài này bằng cách tuân thủ các phương thức giao thức của chúng, xác định chính nó như tuân theo các phương phápnhập bất kỳ tệp tiêu đề cần thiết nào để sử dụng các phương pháp đó.

0

Bạn không đơn độc, tôi vẫn tự học được điều này. Tôi nghĩ là tốt nhất nếu tôi cố giải thích nó bằng lời thay vì viết mã. Có một giao thức chứa một phương thức hoặc hành động nào đó mà bạn muốn thực hiện. Các đại biểu có phương pháp từ giao thức để có thể sử dụng nó để tạo thuận lợi cho một hành động hoặc phương pháp. Tôi thấy bài viết này rất hữu ích http://rypress.com/tutorials/objective-c/protocols. Hi vọng điêu nay co ich.

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