我有一个来自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
我正在尝试为readonly属性previewItemTitle创建getter和setter,这样我就可以添加自定义tile:
·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
这样,据我所知,我将使用synthesize方法创建getter。我该如何创建setter?
答案 0 :(得分:5)
如果您只想在QLPreviewItemCustom
的实现中访问setter,那么为什么不将类继续类中的属性扩展为读写:
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
。
答案 1 :(得分: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