2012-10-07 34 views
14

he encontrado que los métodos NSNibLoading en NSBundle:Reemplazos de los métodos depreciados NSNibLoading (loadNibFile :, loadNibNamed :, etc.)?

+[NSBundle loadNibFile:externalNameTable:withZone:] 
+[NSBundle loadNibNamed:owner:] 
-[NSBundle loadNibFile:externalNameTable:withZone:] 

todos han sido marcados en desuso de los 10,8 - ¿cuál es la forma correcta de cargar las puntas en el 10,8 y más tarde?

Estoy tratando de crear una hoja personalizada en mi aplicación, ¿tengo que crear NSWindowController con initWithWindowNibName para la hoja personalizada?

+0

Considere dividir la porción de hoja personalizada en su propia pregunta separada: ¿Cuál es la mejor manera de implementar una hoja personalizada? sería un buen título. – alfwatt

Respuesta

6

El método NSBundle clase loadNibNamed:owner: está en desuso en OS X v10.8,
loadNibNamed:owner:topLevelObjects: es no y los comentarios in the documentation estado por qué:

diferencia de los métodos heredados, los objetos se adhieren a la norma de cacao reglas de gestión de memoria; es necesario mantener una fuerte referencia a ellos utilizando IBOutlets o manteniendo una referencia a la matriz para evitar que el contenido de la punta sea desasignado.

+0

Aunque en su caso, al crear una hoja personalizada, recomendaría usar un controlador de ventana separado para la hoja. Mi experiencia es que evitarás dolores de cabeza, esp. si agrega controles a la hoja. –

12

Si la aplicación va a apoyar León, a continuación, loadNibNamed:owner:topLevelObjects: no se disparará y obtendrá un (selector no reconocido) excepto cuando se ejecuta en León. Después de buscar en torno a que se me ocurrió esto:

// loadNibNamed:owner:topLevelObjects was introduced in 10.8 (Mountain Lion). 
    // In order to support Lion and Mountain Lion +, we need to see which OS we're 
    // on. We do this by testing to see if [NSBundle mainBundle] responds to 
    // loadNibNamed:owner:topLevelObjects: ... If so, the app is running on at least 
    // Mountain Lion... If not, then the app is running on Lion so we fall back to the 
    // the older loadNibNamed:owner: method. If your app does not support Lion, then 
    // you can go with strictly the newer one and not deal with the if/else conditional. 

    if ([[NSBundle mainBundle] respondsToSelector:@selector(loadNibNamed:owner:topLevelObjects:)]) { 
     // We're running on Mountain Lion or higher 
     [[NSBundle mainBundle] loadNibNamed:@"NibName" 
             owner:self 
          topLevelObjects:nil]; 
    } else { 
     // We're running on Lion 
     [NSBundle loadNibNamed:@"NibName" 
         owner:self]; 
    } 

Si realmente desea utilizar topLevelObjects:&array para Mountain Lion +, y también desea apoyar león, parece que tendrá que recurrir a loadNibFile: externalNameTable : withZone: (disponible tanto como método de clase como de instancia) para la condición Lion (podría estar equivocado sobre esta). Me da la impresión de que loadNibNamed:owner:topLevelObjects: fue creado para reemplazar esto.

También he leído en otra parte que cuando utilice la nueva loadNibNamed:owner:topLevelObjects: para una hoja, debe desmarcar "Liberar cuando está cerrado" para la hoja (ventana). Esto debe tenerse cuidado de cuando se cierra la hoja:

[self.sheet close]; 
self.sheet = nil; 

No estoy seguro exactamente lo que debe hacerse al respecto casilla si va a abrir una ventana no modal. ¿Algunas ideas?

Cuestiones relacionadas