He creado una vista en un xib (con un indicador de actividad, una vista de progreso y una etiqueta).
A continuación, he creado .h/.m archivos:

#import <UIKit/UIKit.h>

@interface MyCustomView : UIView {
    IBOutlet UIActivityIndicatorView *actIndicator;
    IBOutlet UIProgressView *progressBar;
    IBOutlet UILabel *statusMsg;
}

@end

#import "MyCustomView.h"

@implementation MyCustomView    

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        //Initialization code
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

@end

En IB, me puse el propietario de los archivos y de la vista de la identidad a MyCustomView y conecte el IBOutlet para el dueño del Archivo

En MyViewController.m, he:

- (void)viewDidLoad {

    [super viewDidLoad];   

    UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame];
    [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]];

    [myTableView addSubview:subView];
    [subView release];
}

Cuando ejecuto la aplicación, la vista es añadido, pero no puedo ver la etiqueta, la barra de progreso y el indicador de actividad.

¿Qué estoy haciendo mal?

InformationsquelleAutor Sefran2 | 2011-03-18

3 Comentarios

  1. 131

    Usted necesita para cargarlo usando el -loadNibNamed método. -initWithNibName es sólo para UIViewControllers.

    Agregue el código siguiente a su MyCustomView método init:

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil];
    UIView *mainView = [subviewArray objectAtIndex:0];
    [self addSubview:mainView];

    Recuerda que si eres inicializar un objeto de una punta, llama - (id)initWithCoder:(NSCoder *)aDecoder para inicializar, por lo que tendrá que reemplazar que si va a crear el MyCustomView objeto dentro de la punta. Si sólo estás haciendo con initWithFrame:, a continuación, sólo anular y agregue el código anterior. También, en su punta, asegúrese de que tiene un nivel superior UIView, y el lugar de todos los demás elementos dentro de ese (que se asegura de que su subviewArray sólo tiene una entrada).

    Esto cargará las vistas desde la punta y agregarlos a la del objeto, y debe hacer el truco.

    • He utilizado tu código en el initWithFrame y ahora puedo ver la MyCustomView con todos sus elementos, pero hay una cosa que no funciona. En el viewDidLoad de MyViewController he: UIView *subvista = [[MyCustomView alloc] initWithFrame:myTableView.marco]; [subvista setBackgroundColor:[UIColor colorWithRed:0.0 verde:0.0 azul:0.0 alfa:0.5]]; [myTableView addSubview:subvista]; [subvista release]; de modo que tengo de ver la tabla debajo de ella. Alguna idea?
    • Funciona, si lo puse en el initWithFrame. Ahora he de entender cómo apoyar el modo de paisaje para este punto de vista 🙂 Gracias
    • He encontrado otra solución que resuelve también el paisaje problema. Yo uso el loadNibNamed código en MyViewController (cuando tengo que mostrar la subvista) y puedo poner cualquier otra personalización en el awakeFromNib método en MyCustomView.m
    • Hey, el método de [auto addSubview:mainView] sólo se suma a la vista realizados en el IB a los MyCustomView. Probé tu método y, a continuación, trató de establecer el marco para MyCustomView. Resulta que el marco de los cambios, pero el marco de la vista realizados en .xib no cambia. ¿Cómo puedo cambiar el marco de la IB vista a través de MyCustomView?
    • Acaba de hacer mainView.frame = newFrame. Por lo tanto, si desea que el IB vista del marco para ocupar todo el MyCustomView marco, no «mainView.frame = auto.de los límites».
    • gracias por la punta en initWithCoder:. Yo no podía entender cómo mi vista personalizada estaba siendo creado sin init o initWithFrame que se llama.
    • La cosa muy importante que quiero señalar aquí: en xib archivo, en el Archivo del propietario, cambio a nuestra vista personalizada nombre de la clase, NO el elemento de Vista.

  2. 1

    Creo que usted necesita para utilizar este método:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

    Esto es debido a que usted necesita para pasar la .nombre de archivo xib en el «nibNameOrNil».

    • No debería ser suficiente especificar en IB, la identidad del propietario del archivo y ver como MyCustomView?
    • Si yo uso initWithNibName, puedo obtener la advertencia: «el UIView’ no puede responder a ‘-initWithNibName:bundle:’
  3. 0

    Como hocker dijo que usted tiene que utilizar el método de paso en la XIB nombre (sin extensión).

    A continuación, usted tiene el control de esta lista:

    • Abrir la .xib archivo en IB
    • Haga clic en Propietario del Archivo y seleccione la clase correcta (MyCustomView en su caso)
    • Mantenga presionada la tecla control y arrastre desde el Propietario del Archivo a la Vista (Ahora la salida de la vista es aceptar)

    Espero que funcione. Saludos.

    • Nada. Si el Propietario del Archivo es MyCustomView, no puedo arrastrar desde el Propietario del Archivo a la Vista. Así que me he puesto el Propietario del Archivo a MyViewController y la Vista a MyCustomView y arrastre desde el punto de Vista de la IBOutlets, pero no funciona.

Dejar respuesta

Please enter your comment!
Please enter your name here