добавление UITableView программно в UIViewController - PullRequest
13 голосов
/ 23 августа 2011

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

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

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

Ответы [ 5 ]

20 голосов
/ 23 августа 2011

Да, вы можете создать UITableView, делегат, источник данных и родительское представление которого не обязательно являются UITableViewController.Поскольку UITableView - это UIView, вы можете добавить его как подпредставление любого другого UIView.Любой NSObject может быть делегатом или источником данных, если вы реализуете необходимые методы протокола.

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

На самом деле, по моему опыту, не так много людей даже используют UITableViewControllers.Когда в последний раз вы хотели, чтобы представление таблицы занимало все используемое пространство?В общем, я создаю простой старый UIViewController и добавляю UITableView в качестве подпредставления своего представления в дополнение к другим подпредставлениям.

15 голосов
/ 12 июля 2012
/************************************************/
/************* 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
11 голосов
/ 23 августа 2011

Это довольно просто, что-то вроде вашего метода viewDidLoad:

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:tableView];
4 голосов
/ 23 августа 2011

Просто помните, что 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.

Лично я бы предпочел сделать все это в конструкторе интерфейсов, так как вы добились бы того же результата с меньшим количеством кода для обслуживания.

2 голосов
/ 29 декабря 2012

Если вы похожи на меня и уже создали UITableViewController, а затем поняли, что вы проделали с ним столько работы, что переписать его будет проблематично, вы можете просто сделать следующее, чтобы добавить UITableViewController в UIViewController какподвид.

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

Все остальные ответы выше отлично работает.Я полагаю, что добавлю к этому для тех, кто имеет большую реализацию UITableViewController и чувствует, что рефакторинг будет проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...