0

私は iDevice プログラミング学び、プロジェクトの他のものとのインターフェースに使用される新しいサードパーティ ライブラリの使用法を学ぼうとしています。悲しいかな、このライブラリは文書化されておらず、1 つのサンプル プログラムがどのように機能するかを理解するのに苦労しています (私のチームがどのように機能するかについての 2 つの主要な理論は、「ブードゥー」と「忍者の魔法」です)。

私は、コア機能の一部であると思われる部分 (サンプルアプリをプロフェッショナルに見せるために追加されたすべての機能の一部ではなく) を新しいプロジェクトにゆっくりとコピーし、それらを機能させようとしています。 . 現在、次のエラーが発生しています。*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSTimer timerWithTimeInterval:block:repeats:]: unrecognized selector sent to class 0x144e790'

タイマーに関係する元のファイルからすべてをコピーしました。ここで再現します。

@property (nonatomic) NSTimeInterval currentTime;
...
@synthesize currentTime;

// lots of other stuff that has nothing to do with Timers

-(void)setCurrentTime:(NSTimeInterval)time {
   [self willChangeValueForKey:@"currentTime"];
   currentTime = time;
   [self didChangeValueForKey:@"currentTime"];
}

追加する必要があるのはどのセレクターですか?

編集:

tc. の要求で、私はライブラリでそのメソッドを探しに行き、それ自体のファイルでこれを見つけました:

#import <Foundation/Foundation.h>

/**
 * A block based extension for NSTimer
 */

@interface NSTimer (EMAdditions)

/**
 * Allows you set a block for execution when the timer fires.
 * @param interval The time interval
 * @param block The block to execute
 * @param repeat A flag to indicate if the block should continuously repeat
 */
+(NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval block:(void(^)(void))block repeats:(BOOL)repeat;

@end

ライブラリのソース コード (.a ファイルが大きいだけ) にはアクセスできませんが、このメソッドの実装は必要ないのでしょうか? これを含むファイルの #import を試みましたが、問題は解決しませんでした。

4

3 に答える 3

1

NSTimerプロジェクトにカテゴリを追加します。これがファイルです(addNSTimer+Blocks.hNSTimer+Blocks.m

于 2012-10-30T18:22:22.963 に答える
1

tcとして。これは、ライブラリの NSTimer 部分のすべてが含まれていないリンカの問題であると指摘しました。

-all_load解決策は、リンカーにフラグを追加することでした。

于 2012-11-06T21:08:19.393 に答える
0

エラーから、NSTimer がこのセレクター [NSTimer timerWithTimeInterval:block:repeats:] を探していることがわかります。

ドキュメントを調べても問題ないので、使用しているライブラリがその機能を NSTimer に追加した可能性はありますか?

NSTimer で似ている既存の関数は次のとおりです。 [NSTimer timerWithTimeInterval: invocation: repeats:] [timerWithTimeInterval:target:selector:userInfo:repeats:]

タイマーで setCurrentTime を呼び出す必要があり、タイマーが setCurrentTime を実装する同じファイルで初期化されている場合は、2 番目のファイルを使用して、ターゲットを自分自身に設定し、セレクターを @selector(setCurrentTime:) に設定できます。

お役に立てれば

于 2012-10-30T16:24:03.857 に答える