2013-02-10 13 views
9

Ho bisogno di usare NSPageController in qualche progetto ma non ho idea di come funzioni, qualcuno ha tempo per qualche semplice tutorial per mostrarmi perché la documentazione non mi sta aiutando.Tutorial NSPageController per Cocoa su OS X

dimenticato di dire: sto lavorando su Mac project (NONiOS)

risposta

19

semplice modalità libro NSPageController esercitazione

Crea nuovo Cocoa Application -project. Aprire MainMenu.xib nel generatore di interfacce e aggiungere Immagine Bene e Etichetta oggetti nella finestra dell'applicazione. Aggiungi anche Oggetto controllore di pagina.

Set visualizzazione Pagina di controllo di al punto Immagine Bene.


aggiungere alcune immagini per Images.xcassets

ho usato tre immagini in questo progetto di esempio:

  • first.png
  • second.png
  • terzo. png

MyAppDelegate.h

Aggiungi punti fanno riferimento per pagina Controller, Label e Immagine Bene. Impostare MyAppDelegate come NSPageControllerDelegate e aggiungere anche NSArray per le immagini. Dopo questo il file MyAppDelegate.h dovrebbe essere simile a questo:

@interface MyAppDelegate : NSObject <NSApplicationDelegate, NSPageControllerDelegate> 

@property (assign) IBOutlet NSWindow *window; 
@property (unsafe_unretained) IBOutlet NSPageController *pageController; 
@property (weak) IBOutlet NSImageView *imageView; 
@property (weak) IBOutlet NSTextField *infoLabel; 

@property (nonatomic) NSArray *imageArray; 

@end 

MyAppDelegate.m

Alcuni di inizializzazione:

- (void)awakeFromNib { 
    _imageArray = @[ [NSImage imageNamed:@"first"], 
        [NSImage imageNamed:@"second"], 
        [NSImage imageNamed:@"third"]]; 

    /* Set delegate for NSPageControl */ 
    [_pageController setDelegate:self]; 
    /* Set arranged objects for NSPageControl */ 
    [_pageController setArrangedObjects:_imageArray]; 
    /* Set transition style, in this example we use book style */ 
    [_pageController setTransitionStyle:NSPageControllerTransitionStyleStackBook]; 

    /* Set info label's text */ 
    NSString *info = [NSString stringWithFormat:@"Image %ld/%ld", ([_pageController selectedIndex]+1), [_imageArray count]]; 
    [_infoLabel setStringValue:info]; 
} 

pagina Controller metodi delegato:

- (void)pageController:(NSPageController *)pageController didTransitionToObject:(id)object { 
    /* When image is changed, update info label's text */ 
    NSString *info = [NSString stringWithFormat:@"Image %ld/%ld", ([_pageController selectedIndex]+1), [_imageArray count]]; 
    [_infoLabel setStringValue:info]; 
} 

- (NSString *)pageController:(NSPageController *)pageController identifierForObject:(id)object { 
    /* Returns object's array index as identiefier */ 
    NSString *identifier = [[NSNumber numberWithInteger:[_imageArray indexOfObject:object]] stringValue]; 
    return identifier; 
} 

- (NSViewController *)pageController:(NSPageController *)pageController viewControllerForIdentifier:(NSString *)identifier { 
    /* Create new view controller and image view */ 
    NSViewController *vController = [NSViewController new]; 
    NSImageView *iView = [[NSImageView alloc] initWithFrame:[_imageView frame]]; 

    /* Get image from image array using identiefier and set image to view */ 
    [iView setImage:(NSImage *)[_imageArray objectAtIndex:[identifier integerValue]]]; 
    /* Set image view's frame style to none */ 
    [iView setImageFrameStyle:NSImageFrameNone]; 

    /* Add image view to view controller and return view controller */ 
    [vController setView:iView]; 
    return vController; 
} 

Ed è fatto


Se il _pageController è nullo/nullo

Collegare il controller pagina per _pageController premendo ctrl e trascinando con il mouse per _pageController in MyAppDelegate.h file.

+0

Non farlo funzionare. Sospetto che abbia a che fare con il modo in cui sono state aggiunte le immagini. Li ho semplicemente trascinati dal finder al xcasset. NSlog mostra le immagini nella matrice. Ma _pageController restituisce Null quando controllo che sia organizzatoOggetti .. – markhunte

+0

@markhunte Ho aggiunto immagini a .xcassets utilizzando Import ..., se è importante, dal menu popup quando si fa clic con il secondo pulsante del mouse nell'elenco delle risorse della risorsa – juniperi

+0

Lo ha fatto anche. Stessa cosa. Sto usando il tuo codice esatto. – markhunte