2011-10-29 39 views
27

Làm cách nào để truyền một phương thức làm tham số cho phương thức khác? Tôi đang làm điều này trên các lớp học.Phương thức truyền dẫn mục tiêu-C làm tham số

Class A:

+ (void)theBigFunction:(?)func{ 
    // run the func here 
} 

Class B:

- (void)littleBFunction { 
    NSLog(@"classB little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:littleBFunction] 

Loại C:

- (void)littleCFunction { 
    NSLog(@"classC little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:littleCFunction] 
+1

Bạn vượt qua bộ chọn s, Đây là câu hỏi tương tự: http://stackoverflow.com/questions/519600/is-it-possible-to-pass-a-method-as-an-argument-in-objective-c – utahwithak

Trả lời

43

Các loại bạn đang tìm kiếm là selector (SEL) và bạn sẽ có được một phương pháp của bộ chọn như sau:

SEL littleSelector = @selector(littleMethod); 

Nếu phương pháp này có các thông số, bạn chỉ cần đặt : đi đến đâu, như thế này:

SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:); 

Ngoài ra, phương pháp này không thực sự chức năng, chúng được sử dụng để gửi tin nhắn đến lớp cụ thể (khi bắt đầu với +) hoặc trường hợp cụ thể của nó (khi bắt đầu bằng -). Các hàm là loại C không thực sự có một "đích" giống như các phương thức.

Một khi bạn có được một bộ chọn, bạn gọi phương thức đó vào mục tiêu của bạn (có thể là lớp hay chẳng hạn) như thế này:

[target performSelector:someSelector]; 

Một ví dụ điển hình của việc này là UIControl 's addTarget:action:forControlEvents: phương pháp mà bạn thường sử dụng khi tạo UIButton hoặc một số đối tượng điều khiển khác theo chương trình.

+0

Bạn biết làm thế nào tôi sẽ gọi chức năng một khi nó được thông qua trong? Tôi nghi ngờ * [tự func] sẽ hoạt động. – Jacksonkr

+3

[target performSelector: someSelector]; –

7

Objective C làm cho hoạt động này tương đối dễ dàng. Apple cung cấp this documentation.

Để trực tiếp giải quyết câu hỏi của bạn, bạn không gọi hàm, mà là công cụ chọn.Dưới đây là một số mẫu mã:

Big Chức năng:

+ (void)theBigFunction:(SEL)func fromObject:(id) object{ 
    [object preformSelector:func] 
} 

Sau đó cho lớp B:

- (void)littleBFunction { 
    NSLog(@"classB little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:@selector(littleBFunction) fromObject:self] 

Sau đó cho lớp C:

- (void)littleCFunction { 
    NSLog(@"classC little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:@selector(littleCFunction) fromObject:self] 

EDIT: Fix selectors gửi (xóa dấu chấm phẩy)

+0

Bộ chọn của bạn không khớp với các mô tả phương thức, không nên có bất kỳ ':' nào ở cuối chúng. –

+0

Rất tiếc, xin lỗi về điều đó. Tôi không phải là một coder c mục tiêu (tôi đã chỉ dabbled trong nó) và tôi đã làm theo các ví dụ của Apple quá chặt chẽ! – MJD

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