Pregunta

Soy un n00b completo con MacRuby y Cocoa, así que tenlo en cuenta al responder: necesito muchos detalles y explicaciones. :)

He configurado un proyecto simple que tiene 2 ventanas, ambas construidas con Interface Builder. La primera ventana es una lista simple de cuentas usando una vista de tabla. Tiene un botón "+" debajo de la tabla. Cuando hago clic en el botón +, quiero mostrar una ventana "Agregar nueva cuenta".

También tengo un AccountsController < NSWindowController y una clase de AddNewAccountController < NSWindowController, configurados como delegados para estas ventanas, con los métodos de clic de botón apropiados conectados y salidas para hacer referencia a las ventanas necesarias.

Cuando hago clic en el botón "+" en la ventana Cuentas, aparece este código:

    @add_account.center
    @add_account.display
    @add_account.makeKeyAndOrderFront(nil)
    @add_account.orderFrontRegardless

esto funciona muy bien la primera vez que hago clic en el botón +. Todo aparece, puedo ingresar mis datos y hacer que se vinculen a mi modelo. sin embargo, cuando cierro el formulario para agregar una nueva cuenta, las cosas comienzan a ir mal.

Si configuro la ventana para agregar una nueva cuenta para que se libere al cerrar, la segunda vez que haga clic en el botón +, la ventana seguirá apareciendo, pero se congelará. No puedo hacer clic en ningún botón, ingresar datos o incluso cerrar el formulario. Supongo que esto se debe a que el código del formulario se ha publicado, por lo que no hay un bucle de mensajes que procese el formulario ... pero no estoy completamente seguro de esto.

Si configuro la ventana Agregar nueva cuenta para que no se libere al cerrar, entonces la segunda vez que hago clic en el botón +, la ventana se muestra bien y se puede usar, pero aún tiene todos los datos que ingresé previamente. .. todavía está vinculado a mi instancia de clase de cuenta anterior.

¿Qué estoy haciendo mal? ¿Cuál es la forma correcta de crear una nueva instancia del formulario Agregar nueva cuenta, crear un nuevo modelo de cuenta, vincular ese modelo al formulario y mostrar el formulario cuando hago clic en el botón + en el formulario Cuentas?

... todo esto se está haciendo en OSX 10.6.6, 64 bits, con XCode 3.2.4

¿Fue útil?

Solución

El problema es que no crea la ventana cada vez. Soltar al cerrar es una opción un poco molesta y generalmente solo se usa si sabe que el controlador de ventana también se libera cuando se cierra la ventana. (Tenga en cuenta que nunca he usado MacRuby, así que daré código en Obj-C ya que sé que es correcto, espero que pueda convertirlo. Asumiré que GC está activado como debería estar con MacRuby).

Ahora hay dos formas de hacer esto. No estoy completamente seguro de cómo se configuran sus NIB / clases, ya que podría ser de dos maneras.

-

La primera forma de resolverlo es usar las salidas que usa para hacer referencia a los elementos del formulario para dejarlos en blanco cuando vuelva a mostrar la ventana, por ejemplo, [myTextField setStringValue: @ ""]. Si está utilizando encuadernaciones de cacao, entonces es un poco más complicado, pero básicamente debe asegurarse de que el objeto encuadernado esté en blanco. Sin embargo, recomendaría no usar las fijaciones si eres nuevo en Cocoa.

-

La segunda forma es hacer que la clase AddNewAccountController sea una subclase de NSWindowController. Cuando presione el botón +, creará una nueva instancia y la mostrará (recuerde almacenarla en un ivar). La mejor forma de hacerlo sería así:

if (!addAccountController) {
    addAccountController = [[AddNewAccountController alloc] initWithWindowNibName:@"AddNewAccountController"];
    [[addAccountController window] setDelegate:self];
}
[addAccountController showWindow:self];

Esto evita que se cree una nueva instancia si la ventana ya está visible. Luego debe implementar el delegado:

- (void)windowWillClose:(NSNotification *)notification {
    //If you don't create the account in the AddNewAccountController then do it here
    addAccountController = nil;
}

Obviamente, necesitaría mover la ventana a un NIB separado llamado "AddNewAccountController". En este NIB, asegúrese de establecer la clase del propietario del archivo en AddNewAccountController y luego conectar la salida de la ventana del propietario del archivo a la ventana.

Cuando todo esto esté configurado, obtendrá un controlador / ventana nuevo cada vez. También tiene la ventaja de dividir las puntas y los controladores en unidades más específicas.

-

Una última cosa. Si bien está bien hacer algo como esto en una ventana, es posible que desee eventualmente hacer esto a través de una hoja, ya que evitaría la posibilidad de que la ventana para agregar cuenta se oculte detrás de otras ventanas.

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