2011-06-03 11 views
7

¿Cuáles son las razones por las cuales un IBOutlet (conectado) podría ser nil?Razones para que un IBOutlet sea nulo

Tengo una aplicación en mayo que siempre es nil, incluso si recreo todo desde cero (declaración y control).

Respuesta

4

Podría ser que su plumilla esté en mal estado, pero creo que una razón común es tener dos instancias en las que cree que solo tiene una, y la que está utilizando en su código no es la que conectó.

+1

Una razón común para el escenario de "dos instancias" es crear una instancia de controlador en el código y hacerlo el propietario del plumín al cargar el plumín. Luego, en IB, creando * otra * instancia del controlador y conectándose a las salidas de ese, en lugar de a "el propietario del archivo". –

+0

O, creando una instancia en otra plumilla y enganchando una de las instancias, y descubriendo que la salida es 'nil' en la otra. Otra posibilidad es que hayas creado el objeto solo una vez, pero no hayas cargado el plumín del que será el propietario. –

2

Si también ha definido un método loadView que crea la vista, es posible en función de cómo lo inicialice. Si lo inicializa usando alloc-init y el nombre de la pluma no es el mismo que el nombre de la clase, entonces puede tener un caso donde la salida es nula. Pero la respuesta de Chuck parece más razonable de suponer.

0

Una posibilidad: Supongamos que el contenedor IBOutlet es un objeto único con una función como:

+ (singletonObject*) sharedInstance { 
    if(!gGlobalSingletonPointer) { 
     gGlobalSingletonPointer = [[singletonObject alloc] init]; 
    } 

    return gGlobalSingletonPointer; 
} 

de crear el objeto singleton "a la carta" si no existe ya. Guarda un puntero global, al crearlo, en esa función.

Si también crea una instancia de dicho objeto en InterfaceBuilder, y conecta sus salidas, este objeto se creará sin sharedInstance llamando. Si posteriormente llama a sharedInstance, se crea un nuevo objeto (sin conexiones de IBOutlet).

La solución es actualizar el puntero global en la función init o awakeFromNib de singletonObject.

0

¿Estás utilizando un UINavigationController?
Si es así, abra su MainWindow.xib en IB y asegúrese de que el nombre de la pluma de su controlador raíz esté configurado correctamente en el Inspector de atributos.

¿Por qué no se debería configurar esto correctamente? Una de las razones es que la refactorización de 'cambiar nombre' no actualiza esto, y luego las partes internas no encontrarán el plumín con el que conectar su interfaz de usuario. O le cambiaste el nombre a la punta y no actualizaste este campo.

1

Una razón por la que me picó: si el archivo de punta no se incluye en los archivos de recursos de destino por alguna razón (como si los objetivos no estuvieran marcados cuando lo agregaste al proyecto), Xcode no lanza un error pero todas las tomas de ese plumín van a ser nulas ...

Cuestiones relacionadas