2012-05-17 88 views
4

我以爲終於理解了委託的概念,直到發生以下情況:我更改了頭文件以刪除對委託的引用,並且Alert仍然有效。唯一的區別是我失去了代碼提示。爲什麼我不需要在頭文件中聲明UIAlertViewDelegate?

//.h 
#import <UIKit/UIKit.h> 
//@interface ViewController : UIViewController <UIAlertViewDelegate> 
@interface ViewController : UIViewController 
- (IBAction)showMessage:(id)sender; 
@end 

//.m 
#import "ViewController.h" 
@implementation ViewController 
- (IBAction)showMessage:(id)sender { 
    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Hello World!" 
                 message:@"Message." 
                delegate:self 
              cancelButtonTitle:@"Cancel" 
              otherButtonTitles:@"Button 1", @"Button 2", nil]; 
    [message show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 

    if([title isEqualToString:@"Button 1"]) 
    { 
     NSLog(@"Button 1 was selected."); 
    } 
} 
@end 
+0

是的...刪除它會在構建時生成警告。如果你失去語法突出顯示,那是因爲Xcode。這不是一種語言功能。 – CodaFi

回答

9

<UIAlertViewDelegate>在你的頭只是一個參考到要實現在類的委託方法的編譯器。如果您未實現標記爲@required的委託方法,則會收到警告,但由於大多數委託方法通常是@optional,因此您的代碼將編譯並運行良好。這並不意味着你不應該在你的頭文件中添加代表。

3

答案是蘋果不希望要求一個類來實現UIAlertViewDelegate協議。如果Apple希望要求,那麼它會使UIAlertView的代理屬性爲id<UIAlertViewDelegate>。如果你看文檔,事實並非如此。

UIAlertView Class Reference

@property(nonatomic, assign) id delegate

他們一定有他們的理由不使其@property(nonatomic, assign) id<UIAlertViewDelegate> delegate

6

雖然你已經接受了一個答案,但這個問題比這裏討論的要多。

UIAlertViewDelegate協議它實現了委託設計圖案。您可能需要也可能不需要通過採用它來正式通知運行時符合任何給定的協議(特別是如果它沒有任何必需的方法),但這取決於聲明該協議的類的設計。您可以通過將協議名稱中<採納你們班協議>聲明類,這樣當的:

@interface MyClass : NSObject <delegateProtocolName> 

由於被委派許多協議方法是可選的方法,他們經常進行測試,以查看是否採用類實現一個特定的方法是這樣的:

if ([self.delegate respondsToSelector:@selector(delegatedMethod:)]) { 
    // Do something 
} 

在這種情況下,你並不需要,因爲它正在測試,看看具體的委託方法已經實施以符合你的頭文件的協議。

然而,該測試可以被寫成這樣(尤其是如果需要引用多個必要方法/在同樣的功能性質):

if ([self.delegate conformsToProtocol:@protocol(delegateProtocolName)]) { 
    // Do something 
} 

在這種情況下,必須符合協議在你的頭文件中,否則它不會通過測試。

引述(由我加入從The Objective-C Programming Language取出並強調)爲conformsToProtocol的文檔:

此方法確定一致性僅正規 聲明在頭文件的基礎上,如上述說明。它不檢查 以查看協議中聲明的方法實際上是否實現了 - 這是程序員的責任。

1

< UIAlertViewDelegate您在您的課上提到>意味着您所用的AlertView代表的這一類,即視圖控制器委託方法:自指該對象的該委託方法定義在當前班級中。

如果您想要在任何其他類中定義AlertView委託的方法,那麼您必須在該類中提及<UIAlertViewDelegate>並實現該特定類中的方法。

並且還必須更改委託:(classname)。

相關問題