Use una punta como un encabezado de sección de tabla con una class de nib

Quiero crear un encabezado de sección que cargue un file nib y lo establezca como el encabezado UIView. Este file nib también tendrá una class asociada a la que están conectadas las salidas y las acciones, así que quiero cargar esa class con la punta normal.

He rastreado la web y he encontrado varias respuestas similares, pero no puedo hacer que ninguna funcione para mí. Después de jugar durante unos días, logré que la vista se muestre correctamente, pero no hace nada a pesar de agregar conexiones y decirle al text que se muestre de manera diferente.

Por ejemplo, debería borrar el text del título de la sección si es init con nil y lo hace pero aún muestra el mismo text, los bashs de cambiarlo no lo reflejan y las conexiones realizadas con el button no se activan.

Aquí está mi controller de vista para la vista

@interface ADUNewRowHeaderViewController : UIViewController @property (strong, nonatomic) IBOutlet UILabel *sectionTitleField; @property (strong, nonatomic) IBOutlet UIButton *addRowBtn; @property(strong,nonatomic) NSString* sectionTitle; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil title:(NSString*) titleOrNil; @end 

y aquí está la implementación

 @implementation ADUNewRowHeaderViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil title:(NSString *)titleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { if(titleOrNil != nil) { [self setSectionTitle:titleOrNil]; } else { [self setSectionTitle:@""]; } } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)setSectionTitle:(NSString *)sectionTitle { _sectionTitle = sectionTitle; [[self sectionTitleField] setText:sectionTitle]; } @end 

en el controller de vista de tabla real está listdo como

 @property(nonatomic, strong) ADUNewRowHeaderViewController* secHeader; 

y en el file de implementación bajo viewDidLoad como

 [self setSecHeader:[[ADUNewRowHeaderViewController alloc] initWithNibName:nil bundle:nil title:nil]]; [[[self secHeader] addRowBtn] addTarget:self action:@selector(addNewRow:) forControlEvents:UIControlEventTouchUpInside]; 

y

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { return [[self secHeader] view]; } -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return [[self secHeader] view].bounds.size.height; } 

esta es la statement de método para la acción

 - (IBAction)addNewRow:(id)sender; 

Debería hacer una UIView , en lugar de UIViewController . El .m contendría:

 - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self setUp]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; [self setUp]; } - (void)setUp { [[NSBundle mainBundle] loadNibNamed:@"YourNibName" owner:self options:nil]; CGRect frame = self.frame; self.view.frame = CGRectMake(0, 0, frame.size.width, frame.size.height); [self addSubview:self.view]; ... do other initialisations here ... } 

Y el .h :

 @interface ADUNewRowHeaderView : UIView @property (nonatomic, strong) IBOutlet UIView* view; 

Luego en el XIB: Haga que el propietario del file de la class ADUNewRowHeaderView , como es habitual. Y conecte el Outlet de reference de la view nivel superior de XIB a la propiedad de view anterior (es decir, en Propietario del file).

A continuación, tiene una subclass UIView que puede ubicar en otro XIB (como una UIView para la cual establece la class en ADUNewRowHeaderView), o instancia en código y agrega como subvista.

(Alternativamente, podría crear UIView y sus subviews (botones, tags, …) en el código, entonces no necesitaría un XIB. Pero esto solo funciona por supuesto si la UIView es simple y tiene poca lógica propia, y pocas UI elementos que son fáciles de distribuir en código).