Ios UITableViewCell的清洁开发模式&;UIViewController

Ios UITableViewCell的清洁开发模式&;UIViewController,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个NIB,它包含一个充当导航视图的UIView和一个UITableView。NIB将UITableViewController称为其所有者 我想将我的关注点分开:我的单元都将管理它们自己更深层次的交互,但是如果我想展示一个UIImagePickerController,我需要使用UIViewController来实现 我的传统理解是,对于这种品牌的体系结构,委派是最好的选择,但我的UITableView类负责管理单元的表示,单元本身负责管理它们自己的交互。那么,我是否要委托给tablevi

我有一个NIB,它包含一个充当导航视图的UIView和一个UITableView。NIB将UITableViewController称为其所有者

我想将我的关注点分开:我的单元都将管理它们自己更深层次的交互,但是如果我想展示一个
UIImagePickerController
,我需要使用
UIViewController
来实现


我的传统理解是,对于这种品牌的体系结构,委派是最好的选择,但我的
UITableView
类负责管理单元的表示,单元本身负责管理它们自己的交互。那么,我是否要委托给tableview(它不是viewcontroller),哪些委托给UIViewController?我该如何做这样的事情,使之尽可能不显得谦逊?

所以,我解决了这个问题。事实证明,一个好的方法是这样的:

1) 该单元将有一个协议。该协议将采用表示对常驻视图控制器的愿望的方法。更具体地说:

/* .h file of cell */
@protocol LoItemViewCellDelegate <NSObject>

@optional
- (void)cell:(LoItemViewCell *)cell wantsToPresentViewController:(id)viewController;
- (void)cell:(LoItemViewCell *)cell wantsToPresentActionSheet:(UIActionSheet *)actionSheet;

@end
4) 然后,您的代理可以自由地以任何方式实现这些方法

/* Delegate view controller */
- (void)cell:(LoItemViewCell *)cell wantsToPresentViewController:(id)viewController
{
    [self presentViewController:viewController animated:YES completion:nil];
}
通过这种方式,您只传递单元格无法自行处理的内容,而其他所有内容(控制逻辑等)都保留在单元格中。例如,在这个例子中,我将一个UIImagePickerController传递给我的代理,只是为了显示,而我在我的单元格内对该控制器进行所有管理,因为我的单元格是唯一一段明确给出了picker想要做什么的代码

非常干净,我非常推荐这种方法

/* Delegate view controller */
- (void)cell:(LoItemViewCell *)cell wantsToPresentViewController:(id)viewController
{
    [self presentViewController:viewController animated:YES completion:nil];
}