2012-03-12 11 views
5

私はQuickLookのフレームワークからのプロトコルがあります。実装iOSのprocotol - 読み取り専用プロパティ

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

このように、私が理解するように、私はsynthesizeメソッドを使ってゲッターを作成します。どのようにして設定者を作成できますか?

+2

なぜとして_Nameと財産を経由して直接フィールドにアクセスすることができますあなたはreadonlyプロパティのためのセッターが必要ですか? – Antigluk

+0

これは、Quick Titleフレームワークのドキュメントに記載されているので、カスタムタイトルを設定する必要があるためです。 – Benites

答えて

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 

あなたはどこにでもセッターを使用したい場合は、別のivar名を使用し、元のゲッターを新しいものに渡す必要があります。このように:

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

+0

それでは、なぜあなたはそれを読み取り専用と宣言しましたか? – mattjgalloway

+0

申し訳ありませんが、私はおそらく間違った質問をしています。なぜなら、私はiOSプログラミングの新機能だからです。属性previewItemTitleはプロトコルでは読み取り専用に定義されていますが、別の方法で宣言すると警告が表示されます。だから基本的に私の質問です:どのように私はその属性を書き込み可能にする方法でreadonly属性を持つフレームワークプロトコルを実装することができますか? – Benites

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 

、あなたはself.Name

関連する問題