que life container iphone cocoa-touch uiview uiviewcontroller

iphone - life - ¿Cómo invalido la propiedad "ver" en UIViewController?



viewcontroller swift (5)

@ lpaul7 ya publicó un enlace al blog de Travis Jeffery como un comentario, pero es mucho más correcto que todas las otras respuestas que realmente necesita el código para ser una respuesta:

ViewController.h:

@interface ViewController : UIViewController @property (strong, nonatomic) UIScrollView *view; @end

ViewController.m:

@implementation ViewController @dynamic view; - (void)loadView { self.view = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; } @end

Si utiliza un xib, en lugar de anular loadView cambie el tipo de vista raíz de su controlador de vista y agregue IBOutlet a la propiedad.

Consulte Anulación de la propiedad View de UIViewController''s, Done Right para obtener más detalles.

Tengo un UIViewController personalizado y UIView personalizado. Me gustaría anular la propiedad viewcontroller.view para devolver MyCustomUIView.

Ahora mismo tengo:

@interface MyViewController : UIViewController { IBOutlet MyView* view; } @property (nonatomic, retain) IBOutlet MyView* view;

Esto compila, pero recibo una advertencia: el tipo de propiedad ''vista'' no coincide con el tipo de propiedad ''UIViewController'' de super clase.

¿Cómo puedo aliviar esta advertencia?


La propiedad / método de vista de UIViewController devolverá su vista automáticamente. Creo que solo tendrás que enviar el resultado a MyView (o simplemente usar el tipo de ID):

MyView *myView = (MyView*)controller.view; id myView = controller.view;

Creo que el código que has publicado arriba te causará problemas. Probablemente no desee crear un miembro de la vista (porque entonces el controlador almacenará 2 vistas y es posible que no use el derecho internamente) o anular la propiedad de la vista (porque UIViewController tiene un manejo especial para ello). (Vea esto pregunta para más información sobre este último.)


La respuesta corta es que no. La razón es que las propiedades son realmente solo métodos, y si intentas cambiar el tipo de retorno, obtienes esto:

  • Vista (UIView *);
  • Vista (MyView *);

Objective-C no permite la covarianza del tipo de retorno.

Lo que puede hacer es agregar una nueva propiedad "myView", y hacerla simplemente encasillar la propiedad "ver". Esto aliviará las predicciones a lo largo de su código. Simplemente asigne su subclase de vista a la propiedad de vista, y todo debería funcionar bien.


Lo siento, pero tu respuesta corta es incorrecta.

La implementación correcta de esto sería agregar una propiedad @ al archivo de cabecera con su tipo de devolución. Luego, en lugar de @synthesize, agrega el captador y el configurador manualmente y devuelve un tipo de lanzamiento desde [súper vista]

por ejemplo, mi clase es un PlayerViewController

PlayerViewController.h

@property (strong, nonatomic) IBOutlet PlayerView *view;

PlayerViewController.m

- (PlayerView *)view{ return (PlayerView*)[super view]; } - (void)setView:(PlayerView *)view{ [super setView:view]; }

Lo importante es poner la clase correcta en la vista.

Poner una UIView donde va un PlayerView probablemente funcionaría en el Interface Builder, pero no funcionaría correctamente en el código.

Actualmente estoy usando esta implementación.


Si alguien está en Swift 2.0+, puede usar extensiones de protocolo para una implementación reutilizable:

// Classes conforming to this protocol... protocol CustomViewProvider { typealias ViewType } // ... Will get customView accessor for free extension CustomViewProvider where Self: UIViewController, Self.ViewType: UIView { var customView: Self.ViewType { return view as! Self.ViewType } } // Example: extension HomeViewController: CustomViewProvider { typealias ViewType = HomeView } // Now, we can do something like let customView: HomeView = HomeViewController().customView