2012-01-16 24 views
12

Trong một phương pháp phương pháp lớp Tôi tuyên bố như sau:Tôi có thể sử dụng một phương pháp học như một callback đại biểu

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Hello" 
                message:@"World" 
                delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"Done", nil]; 

Bây giờ mặc dù phương pháp chứa là một phương pháp học, trình biên dịch không khiếu nại về việc delegate:self. Bây giờ là đại biểu tôi phải thực hiện phương thức trong giao thức UIAlertViewDelegate.

Hiện giờ có quan trọng không, nếu phương pháp này là phương pháp lớp hay không, để được gọi khi người dùng tương tác với AlertView của tôi?

Tôi hỏi câu hỏi này, vì lớp của tôi không có bất kỳ biến mẫu nào nên tôi chỉ muốn nó chứa các phương thức lớp.

+1

Bạn có nghĩa là phương pháp lớp học? : P –

+0

Bạn có thể thử tên lớp thay vì tự, trong đó đề cập đến trường hợp. –

+0

Đồng thời xem câu trả lời cho http://stackoverflow.com/questions/1781046/dynamically-invoke-a-class-method-in-objective-c. Đó là sự liên quan tôi nghĩ. –

Trả lời

11

Trước tiên, tôi giả định bằng phương thức "tĩnh", nghĩa là phương thức lớp (được khai báo với + thay vì -).

"Trình biên dịch không phàn nàn" về Mục tiêu-C không phải lúc nào cũng cho bạn biết nhiều. Tất cả nó thực sự có nghĩa là bạn đã thuyết phục trình biên dịch rằng mọi thứ nên (hoặc ít nhất có thể) hoạt động trong thời gian chạy.

Cuối cùng, nếu đối tượng bạn cung cấp làm đại biểu phản hồi đúng thông điệp, trình biên dịch sẽ không quan tâm rằng đó là một lớp (và không phải là thời gian chạy). Trong trường hợp này, bạn đang cung cấp self từ một phương thức lớp học. Nó giống như bạn gõ [MyClass class].

Tôi nghĩ rằng điều này có thể là vấn đề cho dù đây là những gì bạn nên làm - nhưng đó có thể nằm ngoài giới hạn của câu hỏi của bạn.

14

Tôi muốn chia sẻ một số những phát hiện của tôi:

  1. Nó không quan trọng cho dù Tôi tuyên bố các đại biểu như thế này delegate:self hoặc delegate:[MyClass class]

  2. Tuy nhiên, nó không thành vấn đề làm thế nào tôi tuyên bố phương pháp :

    này hoạt động

    +(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
        // Some Actions here 
    } 
    

    Mặc dù sau "cú pháp" là tuyên bố trong giao thức UIAlertViewDelegate, nó không hoạt động:

    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
        // Some Actions here 
    } 
    
+1

Có, 'self' và' [MyClass class] 'tương đương với phương thức" MyClass ". Nếu bạn muốn lớp của bạn là đại biểu, thì bạn phải khai báo đây là một phương thức lớp. Tài liệu này mô tả cách triển khai phương thức cá thể, mà tôi nghĩ là khá phổ biến "cách nó được thực hiện". Cuối cùng, điều thực sự quan trọng là bất kỳ đối tượng nào bạn cung cấp khi đại biểu phản hồi bộ chọn "alertView: clicksButtonAtIndex:". Vì vậy, có, câu trả lời vẫn là bạn * có thể * làm điều đó. Cho dù bạn nên là khác nhau. – huskerchad

+0

Wow! Không phải trong một triệu năm tới tôi có thể đoán rằng việc chuyển phương pháp đại biểu thành một phương pháp lớp học sẽ là con đường để đi. Cảm ơn cảm ơn! Tôi đã mất hơn 5 giờ để giải quyết một vấn đề tương tự. ... không cần NSCondition hoặc performSelector hay gì cả! – JohnQ

+0

cảm ơn bạn rất nhiều !!!!!!!!!!! – ElizaS

1

Có bạn có thể !!! Một lớp cũng là một đối tượng.

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