4

iPhone OS 2.x 用に設計されたアプリケーションがあります。

ある時点で私はこのコードを持っています

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  //... previous stuff initializing the cell and the identifier

  cell = [[[UITableViewCell alloc] 
     initWithFrame:CGRectZero 
     reuseIdentifier:myIdentifier] autorelease]; // A


  // ... more stuff
}

しかし、initWithFrame セレクターは 3.0 で廃止されたため、respondToSelector と performSelector を使用してこのコードを変換する必要があります...

if ( [cell respondsToSelector:@selector(initWithFrame:)] ) { // iphone 2.0
  // [cell performSelector:@selector(initWithFrame:) ... ???? what?
}

私の問題は、「initWithFrame:CGRectZero」と「reuseIdentifier:myIdentifier」という 2 つのパラメーターを渡す必要がある場合、A の呼び出しを preformSelector 呼び出しに分割する方法です。

編集 - fbrereto によって提案されたように、私はこれを行いました

 [cell performSelector:@selector(initWithFrame:reuseIdentifier:)
    withObject:CGRectZero 
    withObject:myIdentifier];

私が持っているエラーは、「 'performSelector:withObject:withObject' の引数2の型に互換性がありません。

myIdentifier は次のように宣言されています

static NSString *myIdentifier = @"Normal";

呼び出しを変更しようとしました

 [cell performSelector:@selector(initWithFrame:reuseIdentifier:)
    withObject:CGRectZero 
    withObject:[NSString stringWithString:myIdentifier]];

成功せずに...

もう1つのポイントは、CGRectZeroがオブジェクトではないことです...

4

2 に答える 2

11

を使用しNSInvocationます。

 NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:
                        [cell methodSignatureForSelector:
                         @selector(initWithFrame:reuseIdentifier:)]];
 [invoc setTarget:cell];
 [invoc setSelector:@selector(initWithFrame:reuseIdentifier:)];
 CGRect arg2 = CGRectZero;
 [invoc setArgument:&arg2 atIndex:2];
 [invoc setArgument:&myIdentifier atIndex:3];
 [invoc invoke];

または、直接呼び出しobjc_msgSendます (不要で複雑な高レベルの構造をすべてスキップします)。

cell = objc_msgSend(cell, @selector(initWithFrame:reuseIdentifier:), 
                    CGRectZero, myIdentifier);
于 2010-03-06T18:32:06.063 に答える
1

使用しようとしているセレクターは、実際には@selector(initWithFrame:reuseIdentifier:). 2 つのパラメーターを渡すには、 を使用しますperformSelector:withObject:withObject:。パラメータを正しく設定するには、少し試行錯誤が必要かもしれませんが、うまくいくはずです。そうでない場合は、NSInvocationより複雑なメッセージのディスパッチを処理することを目的としたクラスを調べることをお勧めします。

于 2010-03-06T17:53:49.817 に答える