2012-03-12 16 views
5

Ho un protocollo da quadro QuickLook:Implementazione iOS Procotol - proprietà di sola lettura

/*! 
* @abstract The QLPreviewItem protocol declares the methods that a QLPreviewController instance uses to access the contents of a given item. 
*/ 
@protocol QLPreviewItem <NSObject> 

@required 

/*! 
* @abstract The URL of the item to preview. 
* @discussion The URL must be a file URL. 
*/ 
@property(readonly) NSURL * previewItemURL; 

@optional 

/*! 
* @abstract The item's title this will be used as apparent item title. 
* @discussion The title replaces the default item display name. This property is optional. 
*/ 
@property(readonly) NSString * previewItemTitle; 


@end 

/*! 
* @abstract This category makes NSURL instances as suitable items for the Preview Controller. 
*/ 
@interface NSURL (QLPreviewConvenienceAdditions) <QLPreviewItem> 
@end 

Sto cercando di creare il getter e setter per la proprietà di sola lettura previewItemTitle in modo da poter aggiungere il mio piastrelle personalizzate:

.h

#import <Foundation/Foundation.h> 
#import <QuickLook/QuickLook.h> 

@interface QLPreviewItemCustom : NSObject <QLPreviewItem> { 
    NSURL * previewItemURL; 
    NSString *previewItemTitle; 
} 


@property(readonly) NSURL * previewItemURL; 
@property (readonly) NSString *previewItemTitle; 


@end 

.m

#import "QLPreviewItemCustom.h" 


@implementation QLPreviewItemCustom 

@synthesize previewItemTitle; 
@synthesize previewItemURL; 


@end 

In questo modo, come ho capito, creerò solo il getter con il metodo di sintesi. Come posso creare il setter?

+2

Perché hai bisogno di setter per proprietà readonly? – Antigluk

+0

Perché questo è ciò che la documentazione del framework Quick Look dice di fare, quando è necessario impostare un titolo personalizzato. – Benites

risposta

5

Se è solo nell'implementazione di QLPreviewItemCustom che si desidera accedere al setter, allora perché non estendere la proprietà in una categoria di classe continuazione lettura-scrittura:

QLPreviewItemCustom.m

#import "QLPreviewItemCustom.h" 

@interface QLPreviewItemCustom() 

@property (readwrite) NSURL *previewItemURL; 
@property (readwrite) NSString *previewItemTitle; 

@end 

@implementation QLPreviewItemCustom 

@synthesize previewItemTitle; 
@synthesize previewItemURL; 

@end 

Se vuoi usare il setter ovunque, dovrai usare un nome diverso di ivar e scrivere il tuo getter affinché l'originale passi alla tua nuova. Come questo:

QLPreviewItemCustom.h

#import <Foundation/Foundation.h> 
#import <QuickLook/QuickLook.h> 

@interface QLPreviewItemCustom : NSObject <QLPreviewItem> { 
    NSURL *url; 
    NSString *title; 
} 


@property (readwrite) NSURL *url; 
@property (readwrite) NSString *title; 

@end 

QLPreviewItemCustom.m

#import "QLPreviewItemCustom.h" 

@implementation QLPreviewItemCustom 

@synthesize url; 
@synthesize title; 

- (NSURL*)previewItemURL { 
    return self.url; 
} 

- (NSString*)previewItemTitle { 
    return self.title; 
} 

@end 

Vale la pena anche sottolineare che non è generalmente una buona idea di utilizzare lo stesso prefisso di classe, dato che viene utilizzato da un altro quadro. non chiamatelo QLPreviewItemCustom - chiamatelo come ABCPreviewItemCustom.

+0

Ho bisogno di accedervi da fuori della classe. PreviewControllerClass.previewItemTitle restituisce l'oggetto QLPreviewItem. Poi faccio QLPreviewItemCustom * title = PreviewControllerClass.previewItemTitle. E poi voglio impostare previewItemTitle, ma prima devo creare correttamente quel setter. – Benites

+0

Allora perché hai dichiarato di leggere solo? – mattjgalloway

+0

Scusa, probabilmente sto facendo le domande sbagliate perché sono nuovo alla programmazione iOS. L'attributo previewItemTitle è definito in sola lettura nel protocollo e, se lo dichiaro diversamente, ricevo avvertimenti. Quindi sostanzialmente la mia domanda è: come posso implementare un protocollo framework che abbia un attributo readonly in modo da rendere scrivibile anche quell'attributo? – Benites

1

È possibile scrivere direttamente in variabile, non in proprietà. Se scrivi self.previewItemURL accederai alla proprietà, ma se scrivi solo previewItemURL accederai alla variabile e potrai scriverla senza alcuna restrizione.

Per una maggiore visibilità è possibile assegnare un nome al campo in modo diverso, ad esempio

@interface QLPreviewItemCustom : NSObject <QLPreviewItem> { 
    NSURL * _previewItemURL; 
    NSString *_previewItemTitle; 
} 


@property(readonly) NSURL * previewItemURL; 
@property (readonly) NSString *previewItemTitle; 


@end 

e realizzazione:

@implementation QLPreviewItemCustom 

@synthesize previewItemTitle = _previewItemTitle; 
@synthesize previewItemURL = _previewItemURL; 

@end 

Ora, è possibile accedere campo direttamente tramite _Name e proprietà come self.Name

Problemi correlati