¿Cómo puedo subclassar una UITableView?

Quiero subclamar un UITableView ya que quiero crear un componente de vista de tabla reutilizable en mi aplicación.

La idea es en lugar de usar un delegado para decir cellForRowAtIndexPath. Quiero que la vista de la tabla obtenga esa llamada.

No creo que quiera un UITableViewController ya que este UITableView que quiero build tiene que vivir en varios UIViewControllers (y estos UIViewController pueden tener UITableViews propios).

Subclasé mi UITableView como:

@interface ShareUITableView : UITableView 

pero no se llama a ninguno de sus methods.

My ShareUITableView se crea a través de NIB configurando la class personalizada en ShareUITableView. He verificado en el código que se instancia una ShareUITableView.

Mi UITableView no delega en su controller de vista, así que ese no es el problema.

¿Algunas ideas?

Creo que aún deberías ir con una class de controller. Espero que subclass UITableView sea un trabajo tedioso, de ser posible con una cantidad razonable.

No hay problema para que UIViewController / NoViewController haya implementado el delegado y la fuente de datos y, sin embargo, asigne otro controller a un tableView específico. tenga en count que la fuente de datos y el delegado no necesitan ser subclasss de UITableViewController.

Eche un vistazo a esta respuesta: ¿ Implementar delegado en time de ejecución?

Mi UITableView no delega en su controller de vista, así que ese no es el problema.

Debe tener que usar delegado y fuente de datos, así es como se llenan y configuran los TableViews. de lo contrario, tendrá que sobrescribir todos los methods de UITableView, incluidos los privados, un no-go si desea en AppStore. Recreación de UITableView sin subclass sería aún más fácil.

Si te entendí, necesitas esta statement de class:

 @interface ShareUITableView : UITableView <UITableViewDataSource> 

Y luego, en su constructor de class, debe asignar la instancia misma como su propia fuente de datos:

 - (id)init { //... self.dataSource = self; //... } 

Por supuesto, la class tendrá que adoptar el protocolo.

¡Buena suerte!

MyTableView.h

 // MyTableView.h // This overrides the UITableViewDataSource with your own so you can add any methods you would like. @protocol MyTableViewDataSource <UITableViewDataSource> @requinetworking // This is where you put methods that are requinetworking for your custom table to work (optional) - (int)myRequinetworkingMethod; @optional // This is where you put methods that are optional, like settings (optional) @end // This overrides the UITableViewDelegate with your own so you can add any methods you would like. @protocol MyTableViewDelegate <UITableViewDelegate> @requinetworking // This is where you put methods that are requinetworking for your custom table to work (optional) @optional // This is where you put methods that are optional, like settings (optional) @end // Make sure you add UITableViewDelegate and UITableViewDataSource implementations. @interface MyTableView : UITableView <UITableViewDelegate, UITableViewDataSource> { // Your customer datasource and delegate. id <MyTableViewDataSource> myDataSource; id <MyTableViewDelegate> myDelegate; } @end 

MyTableView.m

 // MyTableView.m #import "MyTableView.h" @implementation MyTableView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code // This is how you can use your custom method. int i = [myDataSource myRequinetworkingMethod]; } return self; } - (void)awakeFromNib { // This assigns the delegate and datasource you assigned to File's Owner in your xib to your custom methods myDataSource = (id<MyTableViewDataSource>)self.dataSource; myDelegate = (id<MyTableViewDelegate>)self.delegate; self.delegate = self; self.dataSource = self; } // This is an example of how to override an existing UITableView method. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // This calls the method implemented in your ViewController. See Below. NSInteger rows = [myDataSource tableView:tableView numberOfRowsInSection:section]; return rows; } @end 

MyViewController.h

 // MyViewController.h #import "MyTableView.h" // Use MyTableViewDataSource and MyTableViewDelegate instead of UITableViewDataSource and UITableViewDelegate @interface MyViewController : UIViewController <MyTableViewDataSource, MyTableViewDelegate> { @end 

MyViewController.m

 // MyViewController.m #import "MyViewController.h" @interface MyViewController () @end @implementation MyViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; } // This method will be overridden by myTableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (int)myRequinetworkingMethod { return 2; } 

La subsorting es una excelente manera de hacer elementos de interfaz de usuario personalizados reutilizables.