2012-03-12 12 views
5

que tiene un protocolo de marco QuickLook:de aplicación iOS procotol - propiedad de sólo lectura

/*! 
* @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 

Estoy intentando crear el captador y definidor de la propiedad de sólo lectura previewItemTitle por lo que puedo añadir mi costumbre de baldosas:

.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 

De esta forma, según tengo entendido, crearé solo el captador con el método de sintetizar. ¿Cómo puedo crear el setter?

+2

Por qué ¿necesita setter para la propiedad de solo lectura? – Antigluk

+0

Porque esto es lo que la documentación del marco de Quick Look dice que hacer cuando necesita establecer un título personalizado. – Benites

Respuesta

5

Si es sólo en su implementación de QLPreviewItemCustom que desea acceder a la incubadora, entonces por qué no extender la propiedad en una categoría de clase a continuación de lectura y escritura:

QLPreviewItemCustom.m

#import "QLPreviewItemCustom.h" 

@interface QLPreviewItemCustom() 

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

@end 

@implementation QLPreviewItemCustom 

@synthesize previewItemTitle; 
@synthesize previewItemURL; 

@end 

Si desea usar setter en todas partes, deberá usar un nombre diferente y escribir su getter para que el original pase al nuevo. De esta manera:

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 señalar también que no es generalmente una buena idea utilizar el mismo prefijo de clase a sí mismo como es utilizado por otro marco. es decir, no lo llame QLPreviewItemCustom - llámelo como ABCPreviewItemCustom.

+0

Necesito acceder desde fuera de la clase. El PreviewControllerClass.previewItemTitle devuelve el objeto QLPreviewItem. Después de hacer QLPreviewItemCustom * title = PreviewControllerClass.previewItemTitle. Y luego quiero configurar el previewItemTitle, pero primero necesito crear ese setter correctamente. – Benites

+0

Entonces, ¿por qué lo declaraste solo de lectura? – mattjgalloway

+0

Lo siento, probablemente estoy haciendo las preguntas incorrectas porque soy nuevo en la programación de iOS. El atributo previewItemTitle se define solo en el protocolo, y si lo declaro de manera diferente recibo advertencias. Así que, básicamente, mi pregunta es: ¿cómo puedo implementar un protocolo marco que tenga un atributo de solo lectura de forma que también pueda escribir ese atributo? – Benites

1

Puede escribir directamente en la variable, no en la propiedad. Si escribe self.previewItemURL accederá a la propiedad, pero si escribe solo previewItemURL accederá a la variable y podrá escribir en ella sin ninguna restricción.

Para obtener más visibilidad que puede nombrar a su campo de forma diferente, por ejemplo

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


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


@end 

e implementación:

@implementation QLPreviewItemCustom 

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

@end 

Ahora, puede acceder campo directamente a través de _Name y la propiedad como self.Name

Cuestiones relacionadas