我有一个故事板,其中我指定了一个父视图控制器和两个容器视图(由两个UITableViewController
s 组成)。在我的父视图控制器中,我有用于过滤两个表的内容的按钮。
我的问题是弄清楚如何将消息发送到容器视图以执行这些过滤器。我想我们使用委托,但有没有实现这些委托的最佳实践方式?
我有一个故事板,其中我指定了一个父视图控制器和两个容器视图(由两个UITableViewController
s 组成)。在我的父视图控制器中,我有用于过滤两个表的内容的按钮。
我的问题是弄清楚如何将消息发送到容器视图以执行这些过滤器。我想我们使用委托,但有没有实现这些委托的最佳实践方式?
根据一些注意事项,您可以为包含的两个表中的每一个定义属性,连接 .xib 中的插座,并直接在按钮处理程序中向它们发送消息。
例如:
@interface ParentViewController : UIViewController
@property (nonatomic) IBOutlet Table1Class *table1;
@property (nonatomic) IBOutlet Table2Class *table2;
@end
@implementation ParentViewController
...
- (IBAction)table1FilterButton:(UIButton *)sender
{
[self.table1 filterBy:...];
}
- (IBAction)table2FilterButton:(UIButton *)sender
{
[self.table2 filterBySomethingElse:...];
}
@end
现在,需要注意的是 - 如果您预计包含的视图控制器的数量可能会显着增长,您可能不想这样做,因为拥有table1
, table2
, table3
, ...,会很笨拙tableN
。您可能还想找到一种方法从两个包含的视图控制器中提取一个公共接口(以协议的形式),以便编写较少分歧的代码来处理每个表的过滤。
也许是这样的,而不是:
@protocol ContainedTableProtocol
@property (nonatomic) NSPredicate *contentFilterPredicate;
@property (nonatomic) NSComparator sortComparator;
@end
@interface ParentViewController : UIViewController
@property (nonatomic) IBOutlet UITableViewController<ContainedTableProtocol> *table1;
@property (nonatomic) IBOutlet UITableViewController<ContainedTableProtocol> *table2;
@end
@implementation ParentViewController
- (IBAction)filterTable1ButtonAction:(UIButton *)sender
{
[self filterTable:self.table1];
}
- (IBAction)filterTable2ButtonAction:(UIButton *)sender
{
[self filterTable:self.table2];
}
- (void)filterTable:(UITableViewController<ContainedTableProtocol> *)table
{
// Create predicate and comparator as needed...
NSPredicate *predicate = ... ;
NSComparator comparator = ... ;
table.contentFilterPredicate = predicate;
table.sortComparator = comparator;
}
@end
这使用一个通用接口将过滤操作应用到每个表视图控制器,然后编码到该接口而不是特定于特定的 APITable1Class
或Table2Class
.
更简单的方法是在子代中声明委托并在父代中实现(即:子代向父代发送数据)。