我正在寻找有关协议和委托在Objective-C中如何工作的其他解释/见解。我有一个正在使用的应用程序,正在使用UINavigationController。有一个主页和一个设置页,允许用户输入一些文本用作主页的标题。我已经实现并完成了所有工作,但是我只需要对其工作方式进行一些说明即可。
这是一个如何设置事物的示例:
@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?我的想法是将'delegate'属性声明为SettingsControllerDelegate,以便其固有地可以保存协议具有的方法信息。然后显然在MainViewController中,我调用了相同的协议方法,该方法只接受参数并为其设置当前导航标题。关于将参数和方法信息存储在何处以供其他方法调用使用,这有点令人困惑。每次我调用SettingsViewController方法'-(void)methodThatPassesStringToDelegateProtocolMethod'时,是否只在MainViewController中调用该方法?
(在我的代码中,我还有一个prepareForSegue方法,该方法将SettingViewController.delegate设置为self。)
任何有关此信息如何传递以及其如何工作的细节的说明都将是很棒的!我能理解复杂性,但是如果您能够以一种整体且易于理解的方式对其进行解释,那将是很好的。我可以理解内存模型等,因此对它在内存中的工作方式进行解释非常有用。
非常感谢你!
最佳答案
我认为您可能要寻找的主要内容是-委托属性到底是什么?报关单
id<SettingsViewControllerDelegate> delegate;
表示您正在声明一个符合
SettingsViewControllerDelegate
协议的对象(id),这意味着它实现了methodThatSetsTitle:
方法。只要符合该协议,就可以是任何对象。因此,当您执行此操作时:[self.delegate methodThatSetsTitle:self.titleNameProperty];
您正在向该对象发送一条消息,无论它是什么,以使用给定的NSString做某事。
在您的特定情况下,您使用Main Page View Controller作为委托,因此上面的代码行将消息从Settings View Controller发送到Main Page View Controller,以将其标题设置为您要作为参数发送的字符串。
就内存而言,就像使用其他任何“常规”实例方法一样。在这种情况下,委托是Main Page View Controller,因此大概在导航堆栈上。
希望这可以帮助!
关于ios - 澄清Objective-C协议(protocol)和授权,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18320579/