将消息从父视图控制器发送到容器视图

时间:2013-09-28 03:17:01

标签: ios objective-c uiviewcontroller

我有一个故事板,我在其中指定了一个父视图控制器和两个容器视图(由两个UITableViewController组成)。在我的父视图控制器中,我有一些按钮,用于过滤两个表的内容。

我的问题是弄清楚如何将消息发送到容器视图以执行这些过滤器。我想我们使用代理,但是有一种实现这些代理的最佳实践方法吗?

2 个答案:

答案 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中声明委托并在父节点中实现(即:子节点将数据发送给父节点)。