1

Xcodeで新しいObjectiveCクラス拡張ヘッダー(.hのみ)テンプレートを使用しようとしていました。方法がわかりません。さて、私はファイル->新しいファイル-> Objective cクラスの拡張ヘッダーを作成し、それに「UICodeButton」という名前を付けました。これはUIButtonから継承されます。その.hファイルに@property(読み取り/書き込み)NSInteger*cIDを書き込みました。そしてそのすぐ下の実装です。

#import <UIKit/UIKit.h>

@interface UIButton ()
@property (readwrite) NSInteger * codeID;
@property (readwrite) NSInteger * pID;
@property (readwrite) NSString * cDesc;
@property (readwrite) NSString *pDesc;
@end

@implementation UIButton

@synthesize codeID;
@synthesize pID;
@synthesize cDesc;
@synthesize pDesc;
@end

私はこれをviewcontrollerclass..soで使用しているので、(ViewCP.hとViewCP.m)ファイルがあります。.mファイルでインポートしています#import"UIButton_UICodeButton.h"ここで、このファイルでビューに書き込んでいるのは、以下をロードしました

- (void)viewDidLoad
{
NSInteger tt = (NSInteger) S_B_T;
NSLog(@" the value is %d",tt);
 self.btnJobType.pID = &(tt);
}

出力:値は555です

定義でS_B_Tを555に設定しています。self.btnJobType.pID =&(tt);にヒットしたとき。エラーをスローします *キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了します。理由:'-[UIRoundedRectButton setPID:]:認識されないセレクターがインスタンスに送信されました。だから私はそれで正しいことを書いていません。pIDのsetメソッドはどこに書くべきですか?合成pIDでうまくいくと思いました。しかし、明らかにそうではありません。では、どうすれば続行できますか?「ObjectiveCクラス拡張」の例を検索しましたが、見つかりませんでした。さらに詳しい情報が必要な場合はお知らせください。ありがとう

4

2 に答える 2

4

@interface SOMEClass ()実装していないクラスでクラス継続(例)を作成することは禁止されています。したがって、フィールド/プロパティをフレームワーククラスに追加することはできません。もちろん、カテゴリを使用して、クラスメソッドまたはインスタンスメソッドのいずれかを追加できます。

代わりに、サブクラスを作成し、そこにプロパティ/ivarsを追加します。

于 2012-10-31T18:29:42.923 に答える
0

別のユースケースで既存のクラスにカテゴリを作成することもできます。一部のクラスでは、サブクラスの作成が禁止されています。カテゴリ(のような@interface SOMEClass (MyCategory))は機能しますが、継承された動作を変更することは想定されていないため、細心の注意を払って実装する必要があります。継承された動作を追加するだけです。

于 2013-07-04T08:00:18.510 に答える