2010-12-11 24 views
14

Tengo un ViewController.xib hecho en IB, que tiene un UITableView. Quiero construir otro archivo xib, p. Ej. SearchViewController.xib, hereda de ViewController.xib. El nuevo SearchViewController.xib debe heredar el UITableView y, además, debe tener un UISearchBar y un UIButton.hereda el archivo xib en Interface Builder

Es posible hacer este escenario con el Generador de interfaz?

Respuesta

10

No, no existe un concepto de herencia entre los archivos NIB. Su única opción es duplicar el archivo original y hacer los cambios necesarios en la copia.

+2

Como dijo Ole, no hay herencia. Puede y debe heredar los controladores que manejan vistas que comparten funcionalidad. – fsaint

+0

Además, es posible crear xibs para una vista específica (aunque no es tan fácil como debería ser). – Sulthan

1

Necesitará archivos .xib separados o, use uno como el predeterminado, luego agregue los controles (por ejemplo, SearchViewController, etc.) programáticamente en el código.

0

Es realmente un problema que debe tenerse en cuenta en las próximas versiones de xCode. Como necesita escribir en código su interfaz debe heredarse en otras clases, lo que es una pesadilla en caso de que se requieran modificaciones más tarde. O puede copiar/pegar archivo xib que también será una pesadilla ya que tendrá que abrirlos todos y aplicar modificaciones

1

La manera de pensarlo es que un archivo XIB es un objeto serializado y no una clase. Una instancia de una clase (es decir, un objeto) no se puede subclasificar, excepto en algunos lenguajes basados ​​en prototipos como Javascript.

Sin embargo, una forma de burlarse de esto es crear una clase padre de tipo UIView que cargue el XIB y lo agregue a sí mismo (recuerde que un XIB contiene un NSArray de elementos visuales).

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TestView" owner:self options:nil]; 
     UIView* mainView = (UIView*)[nibViews objectAtIndex:0]; 
     self.label.text = @"Parent"; 
     [self addSubview:mainView]; 
    } 
    return self; 
} 

El niño puede entonces simplemente anular el initialiser como

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.label.text = @"Child"; 
    } 
    return self; 
} 

El self.label es, por supuesto vinculado a un UILabel en el archivo XIB través de constructor de interfaces y conectado en tiempo de ejecución a través del argumento owner:self.

+1

La mejor respuesta aquí, francamente. – BonanzaDriver

4

Puede utilizar una Vista de contenedor para reutilizar un controlador de vista en particular. De esta manera es suficiente para crear una vez, añadir la lógica de una vez y simplemente puede volver a utilizar el componente en el cual-quiera que te gusta:

enter image description here

Ésta es Apples documentation en el contenedor de vista, creo que sirve!

0

El problema es que la subclase llama a initWithNibName con su nombre de clase.

Me gustaría ir con forzar superclase para cargar el xib superclase siempre, incluso si heredó (asegúrese de que los enchufes están en .h de la superclase)

de anulación superclase initWithNib (que se llamará así como normales init si creó xib basado en vc)

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:@"NameOfTheSuperClass" bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 
Cuestiones relacionadas