2010-03-16 5 views
12

Estoy tratando de usar un UITableView sin usar un plumín y sin usar un UITableViewController.cómo configurar un delegado de vista de tabla

He añadido una instancia UITableView a un UIViewController Al igual que

mytable = [[UITableView alloc] initWithFrame:CGRectMake(22, 207, 270, 233)]; 
[mytable setDelegate:self]; 
[self.view mytable]; 

También he añadido los siguientes métodos vista tabla a mi UIViewController (corte por causa Brevities)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

Me estoy haciendo una advertencia que dice que mi UIViewController no implementa el protocolo delegado UITableView.

¿Cuál es la forma correcta de decirle a la vista de tabla dónde están sus métodos delegados?

(Este es mi primer intento de tratar de utilizar un UITableView sin seleccionar el controlador UITableTableview de las nuevas opciones de archivo)

Respuesta

29

Es necesario para ajustarse a su clase a los protocolos y UITableViewDelegateUITableViewDataSource. (cellForRowAtIndexPath: es en el protocolo UITableViewDataSource)

hacer esto mediante el uso de paréntesis angulares en la definición de interfaz de clase:

@interface myViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {...} 

La razón por la que está recibiendo esta advertencia ahora y no antes cuando lo estaba utilizando un UITableViewController es porque UITableViewController ya se ajusta a estos protocolos.

Así que, en esencia, un UITableViewController es solo una clase que cumple con UITableViewDelegate y UITableViewDataSource, y tiene un miembro de instancia UITableView. Eso es más o menos.

Por supuesto, si no está ya la subclasificación UITableViewController, entonces usted necesita para configurar manualmente el dataSource y delegate del UITableView:

[tableView setDelegate:self]; 
[tableView setDataSource:self]; 
+0

o.k gracias chicos, eso hizo que el error desapareciera. Supongo que usar <..> es cuando quieres implementar más de una interfaz? Todavía tengo un problema, no se llama a ninguno de mis métodos de tabla de presentación. [table ReloadData] no tiene ningún efecto y también mi método didSelectRowAtIndexPath no se está ejecutando cuando hago clic en una celda. ¿Puedes pensar en algo más que pueda estar perdiendo? – dubbeat

+1

No importa, olvidé también configurar el origen de datos y el delegado – dubbeat

1

La advertencia es sólo para informarle que su sección @interface que se declare implementar el protocolo de UITableViewDelegate:

@interface MyUIViewController : UIViewController <UITableViewDelegate> 
16

también debe establecer el delegado dataSource a la libre:

[tableView setDelegate:self]; 
[tableView setDataSource:self]; 

o, igualmente:

tableview.delegate = self; 
tableview.dataSource = self; 
+0

¿Cuál es la diferencia? – RGriffiths

+1

@RichardGriffiths La diferencia es puramente estilística. Ambos son setters y logran lo mismo. –

1
[tableview setDataSource:self] 

usted tiene que dar definitivamente, ¿Por causa de los dos requeridos métodos de UITableView están bajo UITableViewDataSource protocolo.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
0

En Swift3 esta es la forma de configurar UITableViewDelegate:

class FeedsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
     @IBOutlet weak var feedsTableView: UITableView! 
     override func viewDidLoad() { 
      super.viewDidLoad() 

      feedsTableView.delegate = self 
      feedsTableView.dataSource = self 

      // Do any additional setup after loading the view. 
     } 
} 
Cuestiones relacionadas