2014-06-14 19 views
6

Normalmente avrei usato questo metodo per aprire una nuova finestra con un controller finestramodo corretto di creare NSWindow, utilizzando Swift e Cocoa

@class WindowTestController; 

@interface AppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSWindow  *window; 
    WindowTestController  *windowController; 
} 
    @property (weak) IBOutlet NSWindow *window; 
    @property (strong) WindowTestController *windowController; 

    - (IBAction) buttonClicked:(id)sender; 
@end 

E poi

#import "AppDelegate.h" 
    #import "WindowTestController" 

    @implementation AppDelegate 

    @synthesize window; 
    @synthesize windowController; 

- (IBAction) buttonClicked:(id)sender { 
    if (windowController == nil) 
      testWindow = [[WindowTestController alloc] init]; 
      [windowController showWindow:nil]; 
    } 

@end 

Nel tentativo di fare una simile cosa in rapida ho il seguente

import Cocoa 

class AppDelegate: NSObject, NSApplicationDelegate { 

    var testWindow: NSWindowController = WindowTestController(windowNibName: "Window") 

    @IBOutlet var window: NSWindow 

    @IBAction func buttonClicked(sender : AnyObject) { 

     testWindow.showWindow(nil) 
} 

    func applicationDidFinishLaunching(aNotification: NSNotification?) { 
     // Insert code here to initialize your application 
    } 

    func applicationWillTerminate(aNotification: NSNotification?) { 
     // Insert code here to tear down your application 
    } 
} 

in questa situazione come devo impostare un valore predefinito per la testWindow pr operty Sto creando un'istanza di WindowTestController prima che ne abbia bisogno. vale a dire non ho bisogno di fare il

if (windowController == nil) 

È corretto o c'è un altro metodo che assegna la risorsa quando richiesto, o sto preoccupando per nulla?

Facendo

if (windowController == nil) 
     testWindow = WindowTestController(windowNibName: "Window") 
} 

Senza i AppDelegate proprietà risultati nella finestra immediatamente scomparire (cioè deallocata credo).

risposta

10

Questo potrebbe essere un un lavoro per lazy

class AppDelegate : NSApplicationDelegate { 
    lazy var windowController = WindowTestController(windowNibName: "Window") 

    @IBAction func buttonClicked(sender : AnyObject) { 
     windowController.showWindow(sender) 
    } 
} 

self.windowController sarà né assegnati né zero fino a quando si tenta di chiamare, momento in cui sarà Inited. Ma non fino a quel momento.

+0

Eccellente, grazie –

+0

@iluvcapra come lo sai? dove posso trovare tutorial che mi mostrano questo? –

+0

Non lo so, l'ho appena inventato :) Da quando ho postato questo messaggio, Apple ha rimosso il segno "@" dalla parola chiave lazy. – iluvcapra

Problemi correlati