0

我正在寻找一些关于协议和委派如何在 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。)

任何关于如何传递这些信息以及它如何工作的细节的澄清都会很棒!我能理解其中的复杂性,但如果你能以一种全面且易于理解的方式来解释它,那就太好了。我可以理解内存模型等,因此解释它如何在内存中工作将非常有用。

非常感谢!

4

1 回答 1

3

我认为您可能正在寻找的主要内容是 - 委托属性到底是什么?宣言

id<SettingsViewControllerDelegate> delegate;

表示您正在声明一个符合SettingsViewControllerDelegate协议的对象(id)——这意味着它实现了该methodThatSetsTitle:方法。这可以是任何对象,只要它符合该协议即可。所以当你这样做时:

[self.delegate methodThatSetsTitle:self.titleNameProperty];

您正在向该对象发送消息,无论它是什么,以使用给定的 NSString 执行某些操作。

在您的特定情况下,您使用 Main Page View Controller 作为委托,因此上面的代码行从 Settings View Controller 向 Main Page View Controller 发送一条消息,以将其标题设置为您作为参数发送的字符串.

在内存方面,可以像使用任何其他“正常”实例方法一样考虑这一点。在这种情况下,委托是主页面视图控制器,因此它可能位于导航堆栈上。

希望这可以帮助!

于 2013-08-19T18:46:33.933 回答