2012-03-05 11 views
18

Pensé que nunca debería llamar a [super loadView] pero algo me está confundiendo.¿Está bien llamar a [super loadView]?

En la descripción de loadView (UIViewController Class Reference) se dice que "Su implementación personalizada de este método no debe llamar súper.", pero en el ejemplo ZoomingPDFViewer que dio, aplicación loadView (ZoomingPDFViewerViewController) está llamando [súper loadView].

He intentado llamarlo desde mi método loadView y funciona bien, pero simplemente no entiendo qué significa no llamar súper.

Respuesta

25

Definitivamente no debe llamar al [super loadView]. Diría que encontraste un error en el ejemplo de ZoomingPDFViewer.

Usted reemplaza loadView cuando desea crear programáticamente la jerarquía de vista para su controlador de vista (no usa un xib).

Como ha señalado, los documentos claramente indican que no debe llamar a super.

Su implementación personalizada de este método no debe llamar súper.

Asumo esto es para evitar la carga tanto desde un xib y crear programáticamente una vista ya que este método es utilizado por la base para cargar una vista desde un xib:

Si el controlador de vista tiene una archivo de punta asociado, este método carga la vista desde el archivo de punta.

Tenga en cuenta también que, incluso si durante la asignación de su objeto UIViewController se pasa a cero para el parámetro nibNameOrNil que la implementación de UIViewControllerloadView intentará cargar cualquier xib con el nombre de la clase asociada en ella.

Un controlador de vista tiene un archivo de punta asociada si la propiedad nibName devuelve un valor no nulo, el cual se produce si el controlador de vista se instancia de un guión, si ha asignado explícitamente un archivo semilla utilizando el initWithNibName: paquete: método, o si iOS encuentra un archivo de punta en el paquete de la aplicación con un nombre basado en el nombre de clase del controlador de la vista. Si el controlador de vista no tiene un archivo de punta asociado , este método crea un objeto UIView simple en su lugar.

La verdadera intención de este método es para darle el control total de la construcción de la jerarquía de vistas sin depender de la incorporada en el mecanismo de carga xib .:

Puede reemplazar este método con el fin de crear su vistas de forma manual.

Personalmente, puedo reemplazar loadView si: 1.) El xib Me gustaría hacer porque es muy trivial o 2.) El diseño del control es muy dinámico, por lo que la creación de un xib con un diseño estático tiene poco beneficio .

+1

Marca +1 para longitud junto con claro/conciso ... – Damo

0

Si no tiene una vista creada en su IB, entonces debe llamar a [super loadView] en su código para ver su programa.

En el caso de sus vistas personalizadas, se supone que debe crear una vista con el constructor de la interfaz, por lo que no necesita llamarlo.

+0

Bien, pero ¿qué significa "Su implementación personalizada de este método no debe llamar súper"? – Aleksa

+1

significa que está creando la vista, por lo que no necesita cargarla súper –

+1

Puede ver su programa haciendo algo como: 'UIView * myView = [[[UIView alloc] init] liberación automática]; ... (crear jerarquía de vistas) ... self.view = myView; 'Si no está asignando' self.view' a un nuevo valor, entonces ¿para qué sirve reemplazar 'loadView' para empezar? – Sam

1

NSViewController intenta inicializar una vista desde un plumín en -loadView. Como su nombre de punta no está configurado para su controlador, solo le dará un self.view = nil; Asumiría que UIViewController funciona de la misma manera.

Por lo tanto, debe ser seguro, pero es completamente innecesario.

+3

Si bien debería ser inofensivo, si había un xib con un nombre basado en el nombre del controlador de vista, al llamar '[super loadView]' cargaría ese plumín en ' self.view'. Nunca he visto que esto ocurra (ya que nunca llamo al súper), pero de acuerdo con los documentos eso es lo que esperaría. Además, creo que al llamar '[super loadView]' se asignaría mínimamente una vista genérica a 'self.view', que es lo que tu código debería estar haciendo. De nuevo, esto no dañará nada (suponiendo que la implementación personalizada de 'loadView' asigna un valor a' self.view' después de llamar al super), pero es un desperdicio. – Sam

0

Si crea su ViewController programáticamente, puede llamar al super.loadView() en lugar de self.view = UIView(frame: UIScreen.main.bounds) al comienzo de override func loadView() para generar su jerarquía de vista. Sin embargo, no debe llamar al super.loadView() y crear su UIViewController.view personalizado al mismo tiempo. Simplemente no me gusta un robot para explicar la documentación de Apple.

Cuestiones relacionadas