Pregunta

Tengo una subclase UITableViewController que se crea una instancia, dependiendo de donde se utiliza, en una SEMILLA o mediante código. En ambos casos lo que quiero hacer la personalización en el método de inicialización. ¿Eso quiere decir que tengo que poner en práctica tanto initWithNibName:bundle: y initWithCoder:, y cada método sería llamar a su respectivo inicializador súper?

Si bien no necesito esto ahora, ¿y si yo también quiero ser capaz de crear una instancia del controlador de vista con initWithStyle:? ¿Me continuación, tendrá 3 diferentes métodos de arranque que replican el mismo comportamiento?

Parece que esto viola la convención toda designado inicializador, ya que no sería esencialmente 3 inicializadores separados que no terminan llamando a un método init común. ¿O hay una manera de crear un inicializador designado común, mientras que el apoyo a las 3 rutas diferentes instanciar?

¿Fue útil?

Solución

Mi confusión se basa en la creencia errónea de que cada clase debe tener un único inicializador designado. Esto no es cierto, y en el caso de UITableViewController hay 3 inicializadores designados (por lo que puedo decir):

  1. initWithStyle: declarado localmente
  2. initWithNibName:bundle: heredado de UIViewController
  3. initWithCoder: de adoptar protocolo NSCoding

Necesita anular 1 o más de estos en su subclase dependiendo de cómo su subclase se crea una instancia. En mi caso tuve que poner en práctica # 2 y # 3, ya que la clase se puede cargar desde una SEMILLA, o una instancia a través de código con referencia a una SEMILLA. (Me imagino que es raro que se va a utilizar tanto initWithStyle: y initWithNibName:bundle: para una sola clase.)

He encontrado de Apple Codificación Directrices para cacao útil.

Otros consejos

A nivel interno,

  • -initWithStyle: de UITableViewController llama -init de los súper a continuación, la Ivar _tableViewStyle.
  • -init de UIViewController simplemente llama -initWithNibName:bundle: con los argumentos por defecto.
  • UITableViewController no -initWithNibName:bundle: anulación.

Por lo tanto, si reemplaza -initWithNibName:bundle: continuación -initWithStyle: adoptará el cambio también. Por supuesto, ir a lo seguro (ya que no se debe confiar en los detalles de implementación), anular los dos.

(Y no hay necesidad de anular -initWithCoder: a menos que se ONU / archivar los casos.)

Para aclarar, initWithStyle:, siendo inicializador única publicada de UITableViewController en la documentación, es uno de sus inicializador designado explícita.

initWithNibName:bundle: se hereda de UIViewController y es el inicializador designado para esa clase. Como tal, de acuerdo con las directrices de cacao, UITableViewController debe reemplazar este método (mediante la aplicación de ella). Sin embargo, esto no significa que sea un inicializador designado de UITableViewController.

initWithCoder: es, como usted señala, un inicializador designado implícita de NSCoding.

Implementar:

- (void) viewDidLoad

y hacer su inicialización componente allí.

Tiene la ventaja de hacer sólo la inicialización, cuando en realidad se solicita la vista.

O simplemente hacer un método de configuración separada invocada por todos los inicializadores.

Una adición a los puestos de arriba que -initWithCoder referencia:

Si agregó añadido el controlador de vista a su matriz a través de constructor de interfaces (por ejemplo: si el controlador de vista está conectado a un controlador de barra de pestañas en constructor de interfaz), entonces es necesario para anular -initWithCoder

.

(-. InitWithNibName sólo se llama cuando se crea el controlador de vista mediante programación)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top