2011-12-11 34 views
2

我需要兩個UITableView在同一個NIB中。我使用了IB,並使用這兩個表創建了一個視圖。iPhone:如何在一個NIB內控制兩個表格

我的頭文件包含ViewController和兩個類,每個表(見下文)。在IB中,我可以將每個表的委託和數據源連接到FileOwner,但我無法確定如何創建IBOutlet連接。我收到此消息:- [News tableView:numberOfRowsInSection:]:無法識別的選擇器發送到實例0x15d3c0 2011-12-11 07:20:27.480 myCity1 [659:707]由於未捕獲的異常'NSInvalidArgumentException' ,原因是: ' - [新聞中心的tableView:numberOfRowsInSection:]:無法識別的選擇發送到實例0x15d3c0'

這裏的頭文件:

@interface News : UIViewController { 

} 

@end 

@interface TownNews : UITableViewController { 

UITableView *townNewsTable; 

} 

@property (nonatomic, retain) IBOutlet UITableView *townNewsTable; 

@end 

@interface GeneralNews : UITableViewController { 

UITableView *generalNewsTable; 

} 

@property (nonatomic, retain) IBOutlet UITableView *generalNewsTable; 

@end 

回答

6

我正在處理這件事情在我的項目之一(你可以看到它:在appstore中名稱爲IJCAI11的免費應用程序;「People」標籤(那裏的索引是用一個單獨的tableView));就我看到的上面的代碼而言,你會讓事情變得太複雜。我將描述我是如何做到的,而不是說你不應該做什麼:)

我只有一個類,比方說YaddaYaddaViewController。

@interface YaddaYaddaViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
{ 
    UITableView *tableView1; 
    UITableView *tableView2; 
} 
@property (nonatomic, retain) IBOutlet UITableView * tableView1; 
@property (nonatomic, retain) IBOutlet UITableView * tableView2; 

@end 

注意,的viewController從UIViewController中,而不是UITableViewController中派生(類的UITableViewController的目標是能夠實現簡單的tableView在2分鐘內,你應該總是使用的UIViewController更多的自定義的東西。要了解更多有關請看一下UITableViewController類的文檔)。

在「文件所有者」的IB中,我只需設置YaddaYaddaViewController; 我將tableView1和tableView2出口鏈接到視圖中的正確表格; 我將委託和數據源鏈接到兩個tableView1/2,所以我有'多個'委託和數據源。

最後,在代碼中,對所有委託方法(如的tableView::)的cellForRowAtIndexPath我 只是要注意的tableView值,一個代表事件,造成這種方法的調用,如:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableView == self.tableView1) { 
     // some code here 
    } else { 
     // alternative code here 
    } 
} 

希望這會有所幫助!

+0

感謝Makaron 。這看起來更容易。讚賞 – Jeremy

-1

@makaron無論他說什麼是絕對正確的,除了

1)如果你的UITableView的宣言,並希望創建一個庫(不是編程方式實現代碼如下),然後改變你的頭文件: -

@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 
{ 
    IBOutlet UITableView *tableView1; 
    IBOutlet UITableView *tableView2; 
} 

@end 

,並在所有的tableview代表像

NumberOfRowsInSection,NumberOfSection,的cellForRowAtIndexPath,didSelectRowAtIndexPath方法檢查條件

if (tableView == self.tableView1) { 
     // code for tableView1 
    } else { 
     // code for tableView2 
    } 

此外,如果你不想在頭文件中聲明兩個tableViews。降上下兩個tableview中從圖書館的查看和設置標籤,以每個人,並在所有的實現代碼如下代表與標籤的幫助比較喜歡

NumberOfRowsInSection,NumberOfSection,的cellForRowAtIndexPath,didSelectRowAtIndexPath方法檢查條件

//I am assuming that tableView1 has tag set to be 1 

    if (tableView.tag==1) { 
      // code for tableView1 
     } else { 
      // code for tableView2 
     } 
+0

老實說,我看不出你的答案的第一部分與我的不同。關於第二個...是的,也是一種方法,但我更喜歡停留在對象範圍內(如果您願意,可以採用OOP方法),而不是可能的標記。請注意,我沒有說傑瑞米的代碼中沒有錯,除了我懷疑他在過於複雜的事情:) – makaron

+0

首先,當你通過接口生成器(換句話說,如果你不是通過編程方式製作tableView),那麼你有在頭文件中給IBOutlet。 IBOutlet表示Interface Builder插座。第二件事,當你不得不處理一個你沒有設置UITableView的屬性爲非原子並保留的視圖時。 –

+0

emmm ...感謝我從第一個HelloWorld蘋果手冊中得到的一些信息))男人,我已經設置了IBOutlet,並且它是根據apple doc設置的;老兄,我已經設置nonatomic並保留:在相同的字符串,也根據蘋果文檔。 – makaron

相關問題