Подтвердить что ты не робот

Добавление UITableView программно в UIViewController

Я загружаю UIViewController в одну из моих иерархий контроллера Nav, которая будет содержать некоторый текст и некоторые изображения. Внизу, я хочу создать расширяемый и сбрасываемый tableview.

Во-первых, возможно ли это? Если это так, как я могу добавить его и где разместить источник данных и методы делегирования?

Можно ли сделать отдельный подкласс TableViewController, а затем добавить его в свой ViewController в качестве подвью?

4b9b3361

Ответ 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, и мне кажется, что рефакторинг будет больно.