2011-10-01 8 views
19

Estoy tratando de cambiar el contenido de mi Windows, de otra clase, que es la subclase de NSViewController. Estoy intentando el código a continuación, pero no hace nada.¿Cómo obtener la ventana principal (delegado de la aplicación) de otra clase (subclase de NSViewController)?

[NSApplication sharedApplication]mainWindow]setContentView:[self view]]; //code in NSViewController 

[NSApplication sharedApplication]mainWindow] // returns null 

He intentado añadir

[window makeMainWindow]; 

en clase delegado de la aplicación, pero no va a ayudar.

¿Echo de menos algo?

P.S. También estoy allí utilizando el código de abajo para llamar a cualquier función de delegado de mi clase,

[(appDelegate *) [[NSApplication sharedApplication]delegate]MyMethod]; 

pero me pregunto es algo mejor, wihtout importar la clase de delegado. Algo como esto

[[NSApplication sharedApplication]delegate]MyMethod]; 

(que da aviso)

Respuesta

34

Para el mainWindow method the docs say:

Este método podría volver a cero la carga si el archivo semilla de la aplicación no ha terminado, si el receptor no es activo, o si la aplicación está oculta.

acabo de crear una aplicación de prueba rápido y me colocaron el siguiente código:

NSLog(@"%@", [[NSApplication sharedApplication] mainWindow]); 

en mi método applicationDidFinishLaunching:aNotification, y en un método de acción que he conectado a un botón en la ventana principal de mi solicitud .

En el inicio, el mainWindow era nulo, pero cuando hago clic en el botón (después de que todo está funcionando y se muestra), el mainWindow ya no era nulo.

NSApplication proporciona otros métodos que pueden ser útiles para usted:

  • - windows - una matriz de todas las ventanas;
  • – keyWindow - da la ventana que está recibiendo entrada de teclado (o nada);
  • – windowWithWindowNumber: - devuelve una ventana correspondiente al número de ventana: si conoce el número de la ventana cuyos contenidos desea reemplazar, puede usar esto;
  • – makeWindowsPerform:inOrder: - envía un mensaje a cada ventana - se puede usar esto para probar cada ventana para ver si es el que usted está interesado en

Con respecto a los métodos de llamada en el delegate, lo que se dice da. una advertencia funciona bien para mí. Por ejemplo, esto funciona sin advertencias:

NSLog(@"%@", [[[NSApplication sharedApplication]delegate] description]); 

¿Cuál es exactamente la advertencia que recibe? ¿Estás tratando de llamar a un método que no existe?

+0

gracias lot.I tienen una sola ventana. Entonces probablemente usaré windows, para entrar en Array, y usaré el primer objeto en Array. Acerca de los métodos en el delegado, ¿lo intentó desde diferentes clases como viewcontroller? cuando lo llamo, funciona bien, pero da una advertencia, ese delegado puede no responder a ese Método. – User1234

+0

Veo lo que quiere decir ahora sobre las llamadas de delegado. Desafortunadamente, el mensaje [[NSApplication sharedApplication] delegate] siempre devolverá un objeto de tipo NSApplicationDelegate. Tendrá que transmitirlo al delegado de su aplicación si desea enviar mensajes que sean específicos del delegado de su aplicación. Es posible que desee hacer esto como una pregunta separada? –

+0

Creo que la única forma de hacerlo es convertir NSApplicationDelegate en un delegado específico e importarlo en clase. Gracias. – User1234

18

La lucha con MacOS acaba de descubrir esto.

cotización de Apple:

mainWindow

Propiedad

ventana principal de la aplicación. (Sólo lectura)

Discusión

El valor de esta propiedad es nula cuando guión gráfico de la aplicación o archivo semilla aún no ha terminado de cargar. También puede ser nulo cuando la aplicación es inactiva o oculta.

Si sólo tiene una ventana de la aplicación (que es el caso más utilizado) utiliza código siguiente:

NSWindow *mainWindow = [[[NSApplication sharedApplication] windows] objectAtIndex:0]; 

promesa que no será nulo, si la aplicación tiene ventanas.

+0

Estoy comentando una pregunta de hace 3 años, pero esto tampoco parece funcionar. ¿No debería devolver algo, dado que el ViewController al que va el código está listo para cargarse cuando intenta obtener la ventana? –

+0

Si pega este código en viewDidLoad debería funcionar. Por supuesto, si no tiene ventanas en su aplicación, será nula. – Borzh

+0

Gracias por responder. Está en uno de los métodos tableView, ya que es un delegado de NSTableView. Entonces no sé por qué no funcionaría, con una ventana que muestra los contenidos. –

0

Si la propiedad de la ventana no se ha establecido aún, trate de retrasar las cosas hasta que la aplicación ha terminado de cargar, así:

[myObject performSelector:@selector(theSelector) withObject:nil afterDelay:0.1]; 
Cuestiones relacionadas