我正在將UIViewController加載到我的導航控制器的層次結構之一中,該層次結構將包含一些文本和一些圖像。在底部,我將要創建一個可展開和可摺疊的桌面視圖。以編程方式向UIViewController添加UITableView
首先,這個想法可能嗎?如果是這樣,我該如何添加它以及我在何處放置數據源和委託方法?
我可以做一個單獨的TableViewController的子類,然後將它作爲子視圖添加到我的ViewController嗎?
我正在將UIViewController加載到我的導航控制器的層次結構之一中,該層次結構將包含一些文本和一些圖像。在底部,我將要創建一個可展開和可摺疊的桌面視圖。以編程方式向UIViewController添加UITableView
首先,這個想法可能嗎?如果是這樣,我該如何添加它以及我在何處放置數據源和委託方法?
我可以做一個單獨的TableViewController的子類,然後將它作爲子視圖添加到我的ViewController嗎?
是的,你可以創建一個UITableView,其代表,數據源和父視圖不一定是UITableViewController。由於UITableView是一個UIView,你可以添加它作爲任何其他UIView的子視圖。只要您實現所需的協議方法,任何NSObject都可以成爲委託或數據源。
@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
實際上,根據我的經驗,沒有多少人甚至使用UITableViewControllers。您最後一次希望桌面視圖佔用整個可用空間的時間是?一般來說,我創建一個普通的舊UIViewController,並添加一個UITableView作爲其視圖的子視圖,以及其他子視圖。
hey @commanda,即時通訊新的ios開發,並且正在尋找如何正確地實現在uiviewcontroller中插入uitableview和其他對象。無論如何,我偶然發現這一點,並想知道如果你可能知道一些教程/源代碼,我可以看看,所以我可以理解它是如何工作的?謝謝! – gdubs
這是很容易的,在一些你的viewDidLoad方法:
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:tableView];
只要記住,一個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方法的框架。
我個人更喜歡在界面構建器中完成整個任務,因爲您可以通過較少的代碼來實現相同的結果。
我很好奇如何使用IB會導致「少用多少代碼」。在代碼中完全執行此操作時,'initWithNibName:bundle:'將被更改爲一個簡單的'init' - 但是其他內容會發生什麼變化? –
我認爲'datasource'應該是'dataSource' –
/************************************************/
/************* 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
如果你和我一樣,已經創造了一個UITableViewController,然後意識到你做了這麼多工作,它是重新寫這將是一個痛苦,你可以做以下添加的UITableViewController以UIViewController作爲子視圖。
UITableViewController* tableViewController = [[UITableViewController alloc] init];
[self.view addSubview:tableViewController.tableView];
以上所有其他答案的效果很好。我想我會爲那些有大量UITableViewController實現的人增加這一點,並覺得重構將是一個痛苦。
我更喜歡這種方式 - 表控制器是很好地從視圖控制器分離的方式。 – Tommz
您不能將任何內容作爲子視圖添加到視圖控制器,因爲視圖控制器不是視圖,只有視圖具有子視圖。 –