我为我的应用程序构建了一个UITableViewController,它与我的核心数据模型进行交互。它的主要目的是被推到导航控制器上并显示一个实体列表,并允许我编辑/选择并深入了解它们等...
但是,在我的应用程序的其他地方,我现在想要以模态方式显示一个简单的选择器来选择其中一个实体。我认为实现这个的最好方法是构建一个协议来处理选择器,该选择器可以将消息发送给我的代理人,关于用户是否取消或选择了一个实体等......
由于编码的大部分都是相同的,我的问题是:是否可以/或以任何方式将UITableViewController作为协议启用?
即。当正常显示时,它的行为与当前(UIViewController的标准子类)一样,但是也可以由委托以模态方式呈现并将消息传递给委托?
热衷于她对最佳实践的看法?
答案 0 :(得分:1)
您甚至不需要正式的协议。从其他控制器实例化时,只需给你的UITableViewController一个@property (nonatomic, assign) id delegate
。将其设置为委托。使用id
不要太紧密地结合你的课程,也不要保留代表。
在调用控制器中为didCancelPicking...:(id)sender
和didPick...:(id)sender item:(id)pickedItem
实现两种方法。
现在,在以模态方式查看UITableViewController时,您需要做两件事。提供取消按钮+对其做出反应(didCancelPicking...
)并可能修改tableView:didSelectRowAtIndexPath:
以向委托发送didPick...
。始终使用respondsToSelector:
对代表进行测试,以防它performSelector:withObject:
。始终将发件人作为这些委托方法中的第一个参数。
此外,始终显示和隐藏调用类的模态控制器。例如,不要让它从UINavigationController中删除。
这些是我能想到的最好的做法。
关于此处的特定代码重用:当您重用UITableViewController并希望更改模态显示时的行为方式时,您必须确定代码是否过于混乱。例如。您可能稍后想要阻止编辑和向下钻取。您当然可以将此封装在if (self.delegate)
支票中,但是......