2011-08-22 123 views
13

我正在將UIViewController加載到我的導航控制器的層次結構之一中,該層次結構將包含一些文本和一些圖像。在底部,我將要創建一個可展開和可摺疊的桌面視圖。以編程方式向UIViewController添加UITableView

首先,這個想法可能嗎?如果是這樣,我該如何添加它以及我在何處放置數據源和委託方法?

我可以做一個單獨的TableViewController的子類,然後將它作爲子視圖添加到我的ViewController嗎?

+0

您不能將任何內容作爲子視圖添加到視圖控制器,因爲視圖控制器不是視圖,只有視圖具有子視圖。 –

回答

20

是的,你可以創建一個UITableView,其代表,數據源和父視圖不一定是UITableViewController。由於UITableView是一個UIView,你可以添加它作爲任何其他UIView的子視圖。只要您實現所需的協議方法,任何NSObject都可以成爲委託或數據源。

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

實際上,根據我的經驗,沒有多少人甚至使用UITableViewControllers。您最後一次希望桌面視圖佔用整個可用空間的時間是?一般來說,我創建一個普通的舊UIViewController,並添加一個UITableView作爲其視圖的子視圖,以及其他子視圖。

+0

hey @commanda,即時通訊新的ios開發,並且正在尋找如何正確地實現在uiviewcontroller中插入uitableview和其他對象。無論如何,我偶然發現這一點,並想知道如果你可能知道一些教程/源代碼,我可以看看,所以我可以理解它是如何工作的?謝謝! – gdubs

11

這是很容易的,在一些你的viewDidLoad方法:

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
[self.view addSubview:tableView]; 
4

只要記住,一個UITableViewController是的UIViewController只有設置爲控制器的視圖的實現代碼如下一個子類。

所以是絕對有可能的,並且當你想要有一個tableview的時候會相當頻繁地使用,而且還有其他自定義UI元素會阻止你使用UITableViewController。

我通常會選擇將其添加到我的視圖控制器的視圖在其初始化方法或viewDidLoad方法。這取決於您是從NIB創建視圖還是完全以編程方式創建視圖。

在發鈔銀行的情況:

- (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)bundleName 
{ 
    if ((self = [super initWitNibName:nibName bundle:bundleName])) 
    { 
     self.theTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewWhateverStyleYouWantHere]; 
     theTableView.dataSource = self, theTableView.delegate = self; 
     [self.view addSubview:theTableView]; 
     [theTableView release]; 
    } 
} 

然後你可以設置你的tableview在您的viewDidLoad方法的框架。

我個人更喜歡在界面構建器中完成整個任務,因爲您可以通過較少的代碼來實現相同的結果。

+0

我很好奇如何使用IB會導致「少用多少代碼」。在代碼中完全執行此操作時,'initWithNibName:bundle:'將被更改爲一個簡單的'init' - 但是其他內容會發生什麼變化? –

+1

我認爲'datasource'應該是'dataSource' –

15
/************************************************/ 
/************* MyCustomController.m *************/ 
/************************************************/ 

@interface MyCustomController() <UITableViewDataSource, UITableViewDelegate> 
@property (nonatomic, strong) UITableView *tableView; 
@end 

@implementation MyCustomController 

- (id)initWithNibName:(NSString*)nibName bundle:(NSString*)bundleName 
{ 
    self = [super initWitNibName:nibName bundle:bundleName]; 
    if (self) 
    { 
     self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 
     tableView.datasource = self; 
     tableView.delegate = self; 
     [self.view addSubview:self.tableView]; 
    } 

    return self; 
} 

#pragma mark - UITableViewDataSource Methods 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // return number of rows 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // return cell 
} 

#pragma mark - UITableViewDelegate Methods 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // handle table view selection 
} 

@end 
2

如果你和我一樣,已經創造了一個UITableViewController,然後意識到你做了這麼多工作,它是重新寫這將是一個痛苦,你可以做以下添加的UITableViewController以UIViewController作爲子視圖。

UITableViewController* tableViewController = [[UITableViewController alloc] init]; 
[self.view addSubview:tableViewController.tableView]; 

以上所有其他答案的效果很好。我想我會爲那些有大量UITableViewController實現的人增加這一點,並覺得重構將是一個痛苦。

+0

我更喜歡這種方式 - 表控制器是很好地從視圖控制器分離的方式。 – Tommz

相關問題