2011-08-22 13 views
13

Estoy cargando un UIViewController en una de las jerarquías de mi controlador Nav, que contendrá texto y algunas imágenes. En la parte inferior, querré crear una vista de tabla ampliable y colapsable.agregar un UITableView mediante programación a un UIViewController

En primer lugar, ¿es posible esta idea? Si es así, ¿cómo lo agrego y dónde coloco la fuente de datos y delego los métodos?

¿Puedo hacer una subclase separada del TableViewController y luego agregarla a mi ViewController como una subvista?

+0

No se puede agregar nada a un controlador de vista como subvista, porque un controlador de vista no es una vista y solo las vistas tienen subvistas. –

Respuesta

20

Sí, puede crear una UITableView cuyo delegado, origen de datos y vista primaria no son necesariamente UITableViewController. Como UITableView es un UIView, puede agregarlo como una subvista de cualquier otro UIView. Cualquier NSObject puede ser el delegado o el origen de datos, siempre que implemente los métodos de protocolo requeridos.

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

De hecho, en mi experiencia, no muchas personas incluso usan UITableViewControllers. ¿Cuándo fue la última vez que quería que su vista de tabla ocupara todo el espacio útil? En general, creo un viejo UIViewController simple y agrego un UITableView como una subvista de su vista, además de otras subvistas.

+0

hey @commanda, soy nuevo en el desarrollo de ios y estoy buscando cómo implementarlo correctamente insertando una uitableview en un uiviewcontroller con otros objetos en él. De todos modos, me encontré con esto y me preguntaba si es posible que conozca algunos tutoriales/código fuente que puedo ver para que pueda entender cómo funciona. ¡Gracias! – gdubs

11

Es bastante fácil en algo así como su método de viewDidLoad:

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

Sólo recuerde que una UITableViewController es una subclase de UIViewController sólo con el tableview establecer como vista del controlador.

Así que definitivamente es posible y se usa con bastante frecuencia cuando se quiere tener una vista de tabla, pero también otros elementos de IU personalizados que evitan el uso de UITableViewController.

Normalmente elegiría agregarlo a la vista del controlador de mi vista en su método de inicialización o en el método viewDidLoad. Esto variará dependiendo de si está creando sus vistas desde un NIB o totalmente programáticamente.

En caso de ONE:

- (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]; 
    } 
} 

Y entonces se puede establecer el marco de su tableview en su método viewDidLoad.

Personalmente, preferiría hacer todo en el constructor de interfaces, ya que obtendría el mismo resultado con mucho menos código para mantener.

+0

Tengo curiosidad por saber cómo usar IB daría como resultado "mucho menos código". Al hacer esto completamente en código, 'initWithNibName: bundle:' se cambiaría a un simple 'init', pero ¿cambiaría algo más? –

+1

Creo que 'datasource' debe ser '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

Si eres como yo y ya había creado un UITableViewController y luego darse cuenta de que lo hizo mucho trabajo en él que re-escritura sería un dolor, que sólo puede hacer lo siguiente para añadir el UITableViewController al UIViewController como una subvista.

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

Todas las otras respuestas anteriores funcionan muy bien. Me imagino que agregaría esto a aquellos que tienen una implementación fuertemente invertida de un UITableViewController y sienten que refactorizar sería una molestia.

+0

Incluso preferiría esa forma: Table Controller está muy bien separado de View Controller. – Tommz

Cuestiones relacionadas