我正在尋找關於協議和委託如何在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自我。)
任何澄清這個信息是如何傳遞和細節至於它是如何工作將是巨大的!我可以理解複雜性,但是如果能夠以一種整體且易於理解的方式來解釋它,那將是非常棒的。我可以理解記憶模型,以及如何解釋這將如何在內存中工作將是非常有用的。
非常感謝!
當你說「這可以是任何對象,只要它符合該協議」,是否意味着分配給該屬性的對象必須符合協議?換句話說,這就是聲明自己符合和委託屬性的類會見的地方嗎?本質上,屬性檢查是否分配給它的對象具有該協議聲明。 –
Jonathan
沒錯,但要小心 - 「檢查」並不嚴格。您可以將任何對象分配給委託屬性,但如果該對象不符合「設置」視圖控制器委託協議,則只會收到編譯器警告。這通常是爲什麼實際的方法調用被包裝在一個如下所示的if語句中:'if(self.delegate && [self.delegate respondsToSelector:@selector(methodThatSetsTitle :)]){...} – Eric