2011-08-22 21 views
13

Sto caricando un UIViewController in una delle gerarchie del mio controller Nav, che conterrà del testo e alcune immagini. In fondo, desidero creare una tableview espandibile e pieghevole.aggiunta di UITableView a livello di codice a un UIViewController

Prima di tutto, questa idea è possibile? Se lo è, come posso aggiungerlo e dove posso collocare l'origine dati e delegare i metodi?

Posso semplicemente creare una sottoclasse separata di TableViewController e quindi aggiungerla al mio ViewController come sottoview?

+0

Non è possibile aggiungere nulla a un controller di visualizzazione come sottoview, poiché un controller di visualizzazione non è una vista e solo le viste hanno subviews. –

risposta

20

Sì, è possibile creare un UITableView il cui delegato, origine dati e vista genitore non sono necessariamente un UITableViewController. Poiché UITableView è un UIView, puoi aggiungerlo come sottoview di qualsiasi altro UIView. Qualsiasi NSObject può essere il delegato o l'origine dati, purché vengano implementati i metodi di protocollo richiesti.

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

Infatti, nella mia esperienza, molte persone non usano nemmeno UITableViewControllers. Quando è stata l'ultima volta che hai voluto che la tua vista tabella occupasse tutto lo spazio utilizzabile? In generale, creo un semplice vecchio UIViewController e aggiungo un UITableView come sottoview della sua vista, oltre ad altre sottoview.

+0

hey @commanda, sono nuovo nello sviluppo di ios e sto cercando di implementare correttamente l'inserimento di una uitableview in un controllore uiview con altri oggetti su di esso. Ad ogni modo, mi sono imbattuto in questo e mi stavo chiedendo se tu potessi sapere di alcuni tutorial/codice sorgente che posso guardare così posso capire come funziona? Grazie! – gdubs

11

E 'abbastanza facile, in qualcosa come il metodo di viewDidLoad:

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

bisogna ricordare che un'UITableViewController è una sottoclasse di UIViewController solo con la Tableview impostata come vista del controller.

Quindi sì, sicuramente possibile e utilizzato abbastanza frequentemente quando si desidera avere una vista tabella ma anche altri elementi dell'interfaccia utente personalizzati che impediscono l'utilizzo di UITableViewController.

Normalmente scegliere di aggiungerlo alla vista del controller di visualizzazione nel metodo di inizializzazione o nel metodo viewDidLoad. Questo può variare a seconda che tu stia creando le tue viste da una NIB o interamente a livello di programmazione.

In caso di ONA:

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

E quindi è possibile impostare la struttura del vostro Tableview nel metodo viewDidLoad.

Personalmente preferirei fare tutto nel generatore di interfacce in quanto otterresti lo stesso risultato con meno codice da mantenere.

+0

Sono curioso di sapere come usare IB comporterebbe "molto meno codice". Facendo questo completamente in codice, 'initWithNibName: bundle:' sarebbe cambiato in un semplice 'init' - ma cambieresti qualcos'altro? –

+1

Penso che 'datasource' dovrebbe essere '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

Se siete come me e aveva già creato un'UITableViewController e poi rendersi conto che hai fatto tanto lavoro su di esso che riscrivere sarebbe un dolore, si può solo eseguire le seguenti operazioni per aggiungere l'UITableViewController a UIViewController come sottoview.

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

Tutte le altre risposte sopra funzionano alla grande. Immagino di dover aggiungere a questo per coloro che hanno un'implementazione pesantemente investita di un UITableViewController e sentirsi come un refactoring sarebbe un dolore.

+0

Preferirei anche in questo modo - Table Controller è ben separato da View Controller. – Tommz

Problemi correlati