这是Objective-C协议的正确使用吗?

时间:2013-11-30 16:38:22

标签: objective-c cocoa protocols

我正在构建一个应用程序,为了这个问题的目的,有三个自定义类:AppDelegateListWindowControllerViewOptionsWindowControllerAppDelegate会保留ListWindowControllerViewOptionsWindowController的单个实例的属性。

当用户选择特定菜单项时,执行AppDelegate中的实例ViewOptionsWindowController的操作。在此控制器窗口中所做的更改需要反映在ListWindowController的窗口中(在窗口的表视图中添加或删除列)。

所以,我已经定义了一个协议ViewOptionsChanged,它有两个必需的方法,-addColumn-removeColumn(带有参数来指示要添加或删除的内容)。我已经指出ListViewController符合此协议,并在实例化ViewOptionsWindowController时传递AppDelegate的{​​{1}}实例。 ListViewController的init方法的声明是:

ViewOptionsWindowController

因此- (id)initWithListController:(id <ViewOptionsChanged>)listController; 了解ViewOptionsWindowController参数的唯一事实是它符合此协议。

所以,我的问题是,这是否正确使用Objective-C协议?或者其他一些设计模式会更合适吗?

2 个答案:

答案 0 :(得分:2)

是的..但我认为这有点让人困惑。我将listView视为viewOptions的正确委托

可能将协议命名为ViewOptionsDelegate,方法viewOptions:changedTo:并将逻辑添加到listController中添加/删除列?

感觉更像可可,并且关于列的逻辑逻辑不属于viewOptions。

但最终 - 即使你不同意 - 它也可以用于IMO。

答案 1 :(得分:1)

可以使用委托,但是,如果这是一个Mac应用程序,请考虑使用bindings。更少的代码,更少的纠缠,可能更难调试。在Mac或iOS上,您至少可以使用KVO;简单的调试,稍微纠缠一点。