代码之家  ›  专栏  ›  技术社区  ›  Duck

iPhone-如何使用复杂参数的性能选择器?

  •  4
  • Duck  · 技术社区  · 14 年前

    我有一个为iPhoneOS 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:cDirectZero”和“reuseIdentifier:myIdentifier”,如何将对的调用中断为prebelselector调用???

    编辑-根据FBREETO的建议,我做到了

     [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]];
    

    没有成功…

    另一点是cDirectZero不是一个对象…

    2 回复  |  直到 14 年前
        1
  •  11
  •   kennytm    14 年前

    使用 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);
    
        2
  •  1
  •   fbrereto    14 年前

    您要使用的选择器实际上是 @selector(initWithFrame:reuseIdentifier:) . 要传递两个参数,请使用 performSelector:withObject:withObject: . 要使参数正确,可能需要一些尝试和错误,但它应该是有效的。如果没有,我建议您探索 NSInvocation 类,用于处理更复杂的消息调度。