2012-08-12 9 views
5

私はメッセージアプリケーションで件名を管理しようとしています。今は、Subjectフィールドにテキストを表示しようとしています。Theos:チャットキットのCKContentEntryViewからUIView _subjectLineを引き継ぎようとしています

私が持っている主な問題は、有効なビューとして_subjectLineを認識するようにコンパイラを取得することです。これは私がしようとすると_subjectLineと/には何をすれば私が得るものです:

Tweak.xm:8: error: ‘_subjectLine’ was not declared in this scope 

私は微調整に使用する既存のアイテムを宣言するためにどのように任意のアイデアを持っていません。私がXcodeで使用する標準的な宣言は、通常はヘッダファイルにありますが、同じようには動作しません。

私は今、約1週間は周りをグーグルで探しています。私が見つけた最も一般的なチュートリアルや情報は、メソッドがアクティブになったときに警告を表示するという単純なことでした。私はそれを行うことができます、問題ありません。しかし、私はすでに存在するオブジェクトを使う必要があります。

答えて

8

あなたの場合、フックしているクラスのインスタンス変数を使用しようとしているようです。インスタンス変数を変更することは、そのように微調整では機能しません。インスタンス変数(別名ivar)をフックするには、MSHookIvarを使用する必要があります。例:

[Tweak.xm/mm]の

#import <substrate.h> // necessary 
#import <Foundation/Foundation.h> 

@interface TheClassYouAreHooking : NSObject { 
    NSString *_exampleVariable; 
} 
- (void)doSomething; 
@end 

NSString *_exampleVariableHooked; 

%hook TheClassYouAreHooking 
- (void)doSomething 
{ 
    // 'Hook' the variable 

    exampleVariableHooked = MSHookIvar<NSString *>(self, "_exampleVariable"); 

    // The name of the hooked variable does not need to be the same 

    exampleVariableHooked = @"Hello World"; 

    // You can do ANYTHING with the object Eg. [exampleVariableHooked release]; 

} 
%end 
あなたがいることをインポートする必要があるので、

MSHookIvarもBOOLsや山車など

exampleVariableHooked = MSHookIvar<BOOL>(self, "_someBOOL"); 

そのようなものがsubstrate.hで宣言されたフックすることができますさもなければ、あなたの微調整をコンパイルすることはできません。また、ボーナスチップとして、私はちょうどあなたのtweakname.plistにフックしているアプリケーション/フレームワークの識別子を入れなければならないことを思い出させています。

変数をフックした後、必要に応じて変数を変更することができます。ハッピーコーディング!

1

私はChatKitに精通していませんが、すばやく見ました。 _subjectLineはivarであるためアクセスできません。

id subject = [myCKContentEntryView subject]; // should return a CKTextContentView 
NSAssert([subject isKindOfClass:[CKTextContentView class]], @"ack"); 
CKTextContentView * myTextContentView = subject; 

CKTextContentViewにはsetTextメソッドがありますが、パラメータがidなので何を期待しているのかわかりません。ビュー(UILabel?)か文字列を取るかもしれません。試してみてください:

[myTextContentView setText:@"Hello World, w/ jimmies!"]; 

と表示されることがあります。

2

またそうのように、インスタンス変数にアクセスするためのObjective-Cのランタイム関数を使用することができます。

UIView *subjectLine; 
object_getInstanceVariable(self, "_subjectLine", (void **)&subjectLine); 
1

あなたはKVCを使用することができます。例: [オブジェクトvalueForKey:@ "何でも"];

これはどこでも動作し、Objective Cランタイムメソッドまたはモバイル基板を使用するよりもクリーンです。

+0

しかし、クラスはKVCメソッドを上書きして、役に立たない/使用不可能にすることができます。 – Aehmlo

関連する問題