【问题标题】:how can i pass an int value through a selector method?如何通过选择器方法传递 int 值?
【发布时间】:2011-10-26 06:13:27
【问题描述】:

我想从我的选择器方法中传递一个int 值,但选择器方法只接受一个对象类型参数。

int y =0;
[self performselector:@selector(tabledata:) withObject:y afterDelay:0.1];

方法执行到这里

-(int)tabledata:(int)cellnumber {
   NSLog(@"cellnumber: %@",cellnumber);
   idLabel.text = [NSString stringWithFormat:@"Order Id: %@",[[records objectAtIndex:cellnumber] objectAtIndex:0]];
}

但我的方法中没有得到精确的整数值,我只得到了 id 值。

【问题讨论】:

    标签: objective-c ios type-conversion selector


    【解决方案1】:

    如果您“拥有”目标选择器,最简单的解决方案是将 int 参数包装在 NSNumber 中:

    -(int)tabledata:(NSNumber *)_cellnumber {
        int cellnumber = [_cellnumber intValue];
        ....
    }
    

    要调用此方法,您将使用:

    [self performselector:@selector(tabledata:) withObject:[NSNumber numberWithInt:y] afterDelay:0.1];
    

    【讨论】:

    • cellnumber 在 nslog 中打印空值。
    • cellnumber不是指针,怎么可能是NULL呢?你指的是_cellnumber吗?此外,使用“%d”记录整数值,使用“%@”记录 NSNumber 值。
    【解决方案2】:

    这也适用于 int 参数,如果您无法更改要执行的选择器的签名,这将特别有用。

    SEL sel = @selector(tabledata:);
    
    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:sel];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.selector = sel;
    // note that the first argument has index 2!
    [invocation setArgument:&y atIndex:2];
    
    // with delay
    [invocation performSelector:@selector(invokeWithTarget:) withObject:self afterDelay:0.1];
    

    【讨论】:

    • 为什么我们更喜欢完全分解而不是低级(NSMethodSignature)而不是简单的铸造或制作一个对象?什么乱七八糟的?
    【解决方案3】:

    使用 NSTimer 代替您的 performSelector:withObject:afterDelay:,因此:

    int y = 0;
    [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:NO block:^(NSTimer *timer) {
        [self tabledata:y];
    }];
    

    你可以在计时器块中传递任何你想要的东西。

    【讨论】:

    • scheduledTimerWithTimeInterval:repeats:block: 仅适用于 iOS 10.0 或更高版本
    猜你喜欢
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多