澄清Objective-C协议和授权

时间:2013-08-19 18:28:19

标签: ios objective-c delegates protocols

我正在寻找关于协议和委托如何在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中我调用了相同的协议方法,它只接受参数并将当前的Navigation标题设置为它。关于为其他方法调用存储参数和方法信息的位置,这有点令人困惑。每次我调用SettingsViewController方法,' - (void)methodThatPassesStringToDelegateProtocolMethod'时,只需调用MainViewController中的方法吗?

(同样在我的代码中,我有一个prepareForSegue方法,将SettingViewController.delegate设置为self。)

有关如何传递此信息的任何说明以及有关其工作原理的详细信息都会很棒!我可以理解这些复杂性,但是如果你能以一种整体的方式解释它并且很容易理解它会很棒。我可以理解内存模型,以及如何解释它在内存中如何工作将是非常有用的。

非常感谢!

1 个答案:

答案 0 :(得分:3)

我认为您可能正在寻找的主要内容是 - 委托属性究竟是什么?声明

id<SettingsViewControllerDelegate> delegate;

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

[self.delegate methodThatSetsTitle:self.titleNameProperty];

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

在您的特定情况下,您使用主页面视图控制器作为委托,因此上面的代码行从设置视图控制器向主页面视图控制器发送一条消息,将其标题设置为您要发送的字符串作为一个论点。

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

希望这有帮助!