2013-05-15 31 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和呈現彈出。委託協議按預期工作。非常好奇,我做錯了,雖然..我想這與嵌入視圖的父視圖有關。