我有一个故事板,其中我已经指定了父视图控制器和两个容器视图(由两个UITableViewController
组成)。在我的父视图控制器中,我有用于过滤两个表格内容的按钮。发送消息从父视图控制器到容器视图
我的问题是搞清楚如何发送消息到容器视图来执行这些过滤器。我想我们使用代表,但是有没有实现这些代表的最佳实践方式?
我有一个故事板,其中我已经指定了父视图控制器和两个容器视图(由两个UITableViewController
组成)。在我的父视图控制器中,我有用于过滤两个表格内容的按钮。发送消息从父视图控制器到容器视图
我的问题是搞清楚如何发送消息到容器视图来执行这些过滤器。我想我们使用代表,但是有没有实现这些代表的最佳实践方式?
除了一些注意事项,您可以为包含的两个表中的每一个定义属性,连接.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
这使用的通用接口滤波操作码适用于每个表视图控制器,然后到该接口,而不是一个API专用于特定Table1Class
或Table2Class
。
对不起,我迟到了。在尝试你的建议时,我试图在我的'.xlb'中指定插座。为了进一步说明,我为ViewControllers而不是表格创建了网点,因为ViewController负责下载表格的数据。我可以不分配网点到ViewControllers吗? – chongzixin
@ user1258600只要类型匹配,您就可以。这听起来像也许你试图连接一个'UIViewController'出口到一个'UITableView'对象的笔尖;因为它们是不兼容的类型,所以不起作用。对于其他视图控制器,我发现通常最好是将它们全部置于笔尖的顶层对象,并将它们的“视图”出口连接到适当的视图。 –
@CarlVeazey如何为表添加标签并使用switch语句告诉哪个表将消息发送到方法? –
你可以在How do I create delegates in Objective-C?看到答案。
更简单的方法是在Childs中声明委托并在父项中实现(即:子项将数据发送给父项)。
感谢您的回应!我可以澄清“孩子向父母发送数据”部分如何在过滤的情况下工作?我在想,当我点击任何过滤器按钮时,我会发送数据给孩子,让他们自己排序。我不知道如何在这种情况下从孩子向父母工作,虽然 – chongzixin
委托功能就像任何功能。发送任何你想要的。您可以发送谓词或对象的ID或任何对象或块。如果是普通功能,你会怎么做?然后做同样的事情。 – mamcx
对不起,我迟迟没有回到这个问题,所以我开始使用你推荐的代表来解决这个问题。但是现在我发现自己必须在父视图控制器和子视图控制器之间进行双向通信。此链接(http://stackoverflow.com/questions/2168893/can-two-view-controllers-be-delegates-for-one-another)似乎表明这是糟糕的设计。我在想错误吗? – chongzixin
您是否对父级中包含的视图控制器有引用? –
我仍然在实施这个,所以我可以持有对包含的视图控制器的引用(如果需要的话)。这是否是正确的方式来做到这一点? – chongzixin