6

メッセージ アプリで件名を制御しようとしています。現在、件名フィールドにテキストを表示しようとしています。

私が抱えている主な問題は、コンパイラに_subjectLine有効なビューとして認識させることです。これは、私が試して何かをしようとすると得られるものです_subjectLine:

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

微調整で使用する既存のアイテムを宣言する方法がわかりません。私が Xcode で使用する標準的な宣言 (通常はヘッダー ファイルに含まれる) は、同じようには機能しないようです。

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

4

4 に答える 4

10

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

[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は、BOOLやフロートなどをフックすることもできます。

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

それはsubsite.hで宣言されているので、それをインポートする必要があります。そうしないと、微調整をコンパイルできません。また、ボーナスのヒントとして、フックしているアプリ/フレームワークの識別子をtweakname.plistに入力する必要があることをお知らせします。

したがって、変数を「フック」した後、ニーズに合わせて変数を変更できます。ハッピーコーディング!

于 2013-01-17T13:17:30.907 に答える
2

次のように、Objective-C ランタイム関数を使用してインスタンス変数にアクセスすることもできます。

UIView *subjectLine;
object_getInstanceVariable(self, "_subjectLine", (void **)&subjectLine);
于 2013-04-06T01:21:08.353 に答える
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!"];

そして何が起こるか見てください。

于 2013-01-19T17:45:54.290 に答える
1

KVC を使用できます。例: [object valueForKey:@"whatever"];

どこでも機能し、Objective C ランタイム メソッドや Mobile Substrate を使用するよりもクリーンです。

于 2013-04-06T01:40:59.320 に答える