2013-05-15 73 views
0

我正在用故事板构建iPad应用程序。我有一个“数据页面”(视图),我把一个包含数据的tableview放在一个大容器中。那么我有3个小容器,还有桌面,那些应该过滤大容器上的数据。在IB中,所有的tableviews都与embed segues相连接。从视觉上来说,它已经完全按照我需要的方式构建,所有表格都以内容显示。到现在为止还挺好。容器之间的通信,委托协议不起作用?

现在是通信部分:对于每个“过滤器tableview”我实现一个协议方法和委托属性,并将“数据”容器tableview控制器合并到它。但不知何故方法没有被调用。我试图在过滤器tableview控制器中设置[self setDelegate:self],但是使用“:无法识别的选择器发送到实例”崩溃应用程序。

这不是我的第一个委托协议,在我以编程方式实例化一个视图,并需要将代理设置为该视图。它是如何完成的?

下面的问题是:为了使我的数据容器视图控制器符合3委托,我只是设置3个不同类型的ID属性? (意思是,以不同的方式称呼它们?)

任何提示非常感谢!

编辑:添加代码。 [过滤器:选择:]不被称为...没有NSLogs ..

//MainDataViewController.h

@interface MainDataViewController : UITableViewController <UITableViewDelegate,  UITableViewDataSource,FilterDelegate> 

-(void)filter:(Object *)filterObject selecting:(BOOL)selection; 

@end 

//MainDataViewController.m

#import "MainDataViewController.h" 
#import "FilterViewController.h" 

@interface MainDataViewController() 

@end 

@implementation MainDataViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self.tableView setDelegate:self]; 
    [self.tableView setDataSource:self]; 
} 

- (void)filter:(Object *)filterObject selecting:(BOOL)selection; 
{ 
    NSLog(@"test"); 
    NSLog(@"selection object: %@", filterObject); 

} 

@end 

//FilterViewController.h

@protocol FilterDelegate <NSObject> 

- (void)filter:(Object *)filterObject selecting:(BOOL)selection; 

@end 

@interface FilterViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> 

@property (nonatomic, weak) id <FilterDelegate> delegate; 

@end 

//FilterViewController.m

#import "FilterViewController.h" 

@interface FilterViewController() 

@end 

@implementation FilterViewController 

@synthesize delegate; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self setDelegate:self]; 

    [self.tableView setDelegate:self]; 
    [self.tableView setDataSource:self]; 

} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
} 
[self.delegate filter:object selecting:YES]; 
} 
+0

不确定是否理解您的问题,但您可以将您的ViewController设置为每个过滤器的代表。然后在'tableView:didSelectRowAtIndexPath'中,你可以用一个if语句检查tableView调用哪个方法(比如通过比较标签)。 – Kirualex

+0

非常感谢您的回答!但是:这不是相反吗?我需要将我的3个FilterTableViews的索引传递给MainDataTableView。我认为需要将3设置为MainView的代表。我错过了什么吗? – L00ps

+0

你应该看看委托模式。委托是一个指向你的过滤器的指针,以便他们调用他们的方法(在协议中声明)。 – Kirualex

回答

0

[self setDelegate:self]看起来不正确。我认为它应该看起来更像︰

[self.filter1TableView setDelegate:self]; 
[self.filter2TableView setDelegate:self]; 
[self.filter3TableView setDelegate:self]; 
+0

非常感谢!不知道我理解正确。我是否需要首先实例化我的视图?或者为该课程设置一个属性?由于我使用故事板,我没有这样的参考。 – L00ps

+0

在故事板中,您希望创建对每个过滤器表格视图的引用(右键单击拖动到视图控制器.h文件,给每个名称)(也请注意,在每个过滤器表格之前添加了“self.”查看名称) – bobnoble

+0

再次感谢,但您的建议没有奏效。 – L00ps

0

我最终删除containerViews和呈现弹出。委托协议按预期工作。非常好奇,我做错了,虽然..我想这与嵌入视图的父视图有关。