Добавление UITableView программно в UIViewController
Я загружаю UIViewController в одну из моих иерархий контроллера Nav, которая будет содержать некоторый текст и некоторые изображения. Внизу, я хочу создать расширяемый и сбрасываемый tableview.
Во-первых, возможно ли это? Если это так, как я могу добавить его и где разместить источник данных и методы делегирования?
Можно ли сделать отдельный подкласс TableViewController, а затем добавить его в свой ViewController в качестве подвью?
Ответы
Ответ 1
Да, вы можете создать UITableView, чей делегат, источник данных и родительский вид не обязательно являются UITableViewController. Поскольку UITableView является UIView, вы можете добавить его в качестве подзапроса любого другого UIView. Любой NSObject может быть делегатом или источником данных, если вы реализуете необходимые методы протокола.
@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
Фактически, по моему опыту, не многие люди даже используют UITableViewControllers. Когда вы в последний раз хотели, чтобы ваш настольный просмотр занимал все полезное пространство? В общем, я создаю простой старый UIViewController и добавляю UITableView в качестве подзадача своего представления в дополнение к другим подзонам.
Ответ 2
/************************************************/
/************* 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
Ответ 3
Это довольно просто, что-то вроде вашего метода viewDidLoad:
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:tableView];
Ответ 4
Просто помните, что UITableViewController является подклассом UIViewController только с представлением таблицы в виде представления контроллера.
Итак, да, безусловно, возможно и используется довольно часто, когда вы хотите иметь табличное представление, но также и другие пользовательские элементы пользовательского интерфейса, которые мешают вам использовать UITableViewController.
Обычно я хотел бы добавить его в свой вид контроллера представления как в его методе инициализации, так и в методе viewDidLoad. Это будет зависеть от того, создаете ли вы свои представления из NIB или полностью программно.
В случае 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];
}
}
И затем вы можете установить фрейм своего табличного представления в свой метод viewDidLoad.
Я лично предпочел бы сделать все это в построителе интерфейса, поскольку вы достигнете того же результата, что и меньше, чтобы поддерживать код.
Ответ 5
Если вы похожи на меня и уже создали UITableViewController, а затем поняли, что вы так много работали над этим, что переписывать его было бы больно, вы можете просто сделать следующее, чтобы добавить UITableViewController в UIViewController как подвью.
UITableViewController* tableViewController = [[UITableViewController alloc] init];
[self.view addSubview:tableViewController.tableView];
Все остальные ответы выше отлично работают. Я полагаю, что добавлю это для тех, у кого есть сильно инвестированная реализация UITableViewController, и мне кажется, что рефакторинг будет больно.