2012-03-12 41 views
5

我從QuickLook的框架協議:落實內部監督網絡協議 - 只讀屬性

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

我試圖創建爲只讀屬性previewItemTitle getter和setter,所以我可以添加我的自定義瓷磚:

.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 

這樣,據我所知,我將創建合成方法的getter。我如何創建二傳手?

+2

爲什麼你只需要使用只讀屬性的setter? – Antigluk 2012-03-12 20:16:22

+0

因爲這是Quick Look框架的文檔所要做的事情,所以當您需要設置自定義標題時。 – Benites 2012-03-12 21:59:53

回答

5

如果它只是在你的實現QLPreviewItemCustom,你要訪問的制定者,又何嘗不是在一個類中延續類別擴展屬性來讀寫:

QLPreviewItemCustom.m

#import "QLPreviewItemCustom.h" 

@interface QLPreviewItemCustom() 

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

@end 

@implementation QLPreviewItemCustom 

@synthesize previewItemTitle; 
@synthesize previewItemURL; 

@end 

如果你想在任何地方使用setter,那麼你將不得不使用一個不同的ivar名稱,併爲原稿寫入你的getter以傳遞給你的新名字。就像這樣:

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 

值得還指出,由於所使用的它不是通常使用相同的類前綴自己是個好主意另一個框架。即不稱之爲QLPreviewItemCustom - 稱之爲ABCPreviewItemCustom

+0

我需要從課外訪問它。 PreviewControllerClass.previewItemTitle返回QLPreviewItem對象。比我做QLPreviewItemCustom * title = PreviewControllerClass.previewItemTitle。然後我想設置previewItemTitle,但首先我需要正確創建該設置器。 – Benites 2012-03-12 22:04:04

+0

那你爲什麼要宣佈它只讀? – mattjgalloway 2012-03-12 22:09:18

+0

對不起,我可能會問錯誤的問題,因爲我是iOS編程新手。 previewItemTitle屬性在協議中定義爲readonly,如果我以不同的方式聲明,則會收到警告。所以基本上我的問題是:我怎樣才能實現一個只讀屬性的框架協議,使我的屬性可寫? – Benites 2012-03-12 22:19:08

1

你可以直接寫入變量,而不是屬性。如果您編寫self.previewItemURL,您將訪問屬性,但是如果您只寫了previewItemURL,則將訪問變量,並且可以無限制地寫入該變量。

更多的知名度,你可以不同的方式命名你的領域,例如

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


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


@end 

和實施:

@implementation QLPreviewItemCustom 

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

@end 

現在,你可以直接通過_Name和屬性來訪問字段self.Name