2013-08-19 54 views
0

我正在尋找關於協議和委託如何在Objective-C中工作的其他解釋/見解。我有一個我正在使用的應用程序,它使用的是UINavigationController。有一個主頁面和一個設置頁面,用戶可以輸入一些文字作爲主頁面的標題。我已經完成了所有工作,但我只需要澄清一下它是如何工作的。對Objective-C協議和授權的澄清

這裏的事情是如何建立一個例子:

@interface MainPageViewController : UIViewController 

@end 


@interface MainPageViewController() <SettingsControllerDelegate> 

// properties 

@end 


@implementation MainPageViewController 


- (void)methodThatSetsTitle(NSString *)title 
{ 
    self.title = title; 
} 

@end 

.....

@protocol SettingsControllerDelegate <NSObject> 
{ 
    - (void)methodThatSetsTitle(NSString *)title 
} 

@interface SettingsViewController 

@property (weak, nonatomic) id <SettingsControllerDelegate> delegate; 

@end 


@interface SettingsViewController() 
// properties that will be used for a text field and holding an NSString 
@end 

@implementation SettingsViewController 

- (void)methodThatPassesStringToDelegateProtocolMethod 
{ 
    // Code that will set the property for the NSString title 

    [self.delegate methodThatSetsTitle:self.titleNameProperty]; 
} 

@end 

我的問題是:如何從SettingsViewController NSString的標題居然獲得通過,以MainViewController?我的想法是'委託'屬性被聲明爲一個SettingsControllerDelegate,因此它固有地可以保存協議所具有的方法的信息。然後很明顯,在MainViewController中,我調用了相同的協議方法,該方法只取參數並將當前的導航標題設置爲該方法。對於那個參數和方法信息被存儲用於其他方法調用以獲取它,這只是有點令人困惑。每次我調用SettingsViewController方法時,' - (void)methodThatPassesStringToDelegateProtocolMethod',只需調用MainViewController中的方法?

(也用我的代碼我有一個prepareForSegue方法設置是在SettingViewController.delegate自我。)

任何澄清這個信息是如何傳遞和細節至於它是如何工作將是巨大的!我可以理解複雜性,但是如果能夠以一種整體且易於理解的方式來解釋它,那將是非常棒的。我可以理解記憶模型,以及如何解釋這將如何在內存中工作將是非常有用的。

非常感謝!

回答

3

我認爲您可能要查找的主要內容是 - 代表屬性是什麼?聲明

id<SettingsViewControllerDelegate> delegate; 

說,你是聲明對象(ID),其符合SettingsViewControllerDelegate協議 - 這意味着它實現了methodThatSetsTitle:方法。這可以是任何對象,只要它符合該協議即可。所以,當你這樣做:

[self.delegate methodThatSetsTitle:self.titleNameProperty]; 

您發送一條消息給該對象,不管它是什麼,做給定的NSString東西。

在您的特定情況下,您使用主頁面視圖控制器作爲委託,因此上面的代碼行將從設置視圖控制器向主頁面視圖控制器發送消息,以將其標題設置爲您所使用的字符串作爲參數發送。

就內存而言,可以像使用任何其他「常規」實例方法那樣考慮這一點。在這種情況下委託是主頁面視圖控制器,因此大概在導航堆棧上。

希望這會有所幫助!

+0

當你說「這可以是任何對象,只要它符合該協議」,是否意味着分配給該屬性的對象必須符合協議?換句話說,這就是聲明自己符合和委託屬性的類會見的地方嗎?本質上,屬性檢查是否分配給它的對象具有該協議聲明。 – Jonathan

+1

沒錯,但要小心 - 「檢查」並不嚴格。您可以將任何對象分配給委託屬性,但如果該對象不符合「設置」視圖控制器委託協議,則只會收到編譯器警告。這通常是爲什麼實際的方法調用被包裝在一個如下所示的if語句中:'if(self.delegate && [self.delegate respondsToSelector:@selector(methodThatSetsTitle :)]){...} – Eric