我有一个故事板,我在其中指定了一个父视图控制器和两个容器视图(由两个UITableViewController
组成)。在我的父视图控制器中,我有一些按钮,用于过滤两个表的内容。
我的问题是弄清楚如何将消息发送到容器视图以执行这些过滤器。我想我们使用代理,但是有一种实现这些代理的最佳实践方法吗?
答案 0 :(得分:1)
除了一些警告,您可以为两个包含的表中的每一个定义属性,连接.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
,{{1}将是不实用的},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
或Table1Class
的API。
答案 1 :(得分:0)
您可以在How do I create delegates in Objective-C?找到答案。
更简单的方法是在Childs中声明委托并在父节点中实现(即:子节点将数据发送给父节点)。