如何将NSNumber传递给期望bool的方法?

时间:2012-01-01 21:53:48

标签: objective-c object nsnumber

[[self.view.window subviews] makeObjectsPerformSelector:@selector(setUserInteractionEnabled:) withObject:[NSNumber numberWithBool:NO]];

我在另一个问题的答案(How to disable touch input to all views except the top-most view?)中看到了这个代码,当它工作时它让我感到惊讶,因为setUserInteractionEnabled:期望一个BOOL(因为它不是一个客观的c对象,所以不能通过在performSelector:withObject:类型方法中)。

说明传递NSNumber的文档在哪里可以?它适用于所有方法,还是需要特殊实现?它是否仅适用于BOOL,还是可以使用int等类型来完成?

3 个答案:

答案 0 :(得分:3)

如果您只是希望您的代码能够运行,请投票并接受Paul.s的回答。如果你想阅读有关执行实验的书呆子,请继续。在我的原始答案的评论中有一些有趣的讨论,我在下面总结了这些讨论。

这不起作用。我在iOS项目中尝试过,userInteractionEnabled属性不受发送performSelector:withObject:的影响。这与documentation匹配 NSObject声明:

  

aSelector应该标识一个采用id类型的单个参数的方法。对于具有其他参数类型和返回值的方法,请使用NSInvocation。

现在具有传奇色彩的Peter Hosey构建了一个样本基础工具here,当你传递一个双倍的时候,这个工具很有效,当我发现自己的时候也是浮动的。

为了增加好奇心的好奇心,这在iOS项目中不起作用(双重或浮动)。

总之,我认为我们可以说以下内容:

  • 如果它有效,它是偶然的,不应该依赖
  • 关于堆栈溢出的已接受或赞成的答案不一定正确

答案 1 :(得分:2)

你不能将NSNumber作为对象传递,并将它作为BOOL出现在另一端。但是,有一些解决方法。

  1. 使用NSInvocation。您需要创建一个使用NSInvocation的NSArray类别。这有点乱。

  2. 使用setUserInteractionEnabled:-like函数(具有相似的名称?)创建一个UIView类,该函数使用NSNumber进行操作,然后NSNumber使用NSNumber的BOOL值调用setUserInteractionEnabled :.类似的东西:

    @implementation UIView (Additions)
    - (BOOL)setUserInteractionEnabled2:(NSNumber *)aBool
    {
      self.userInteractionEnabled = [aBool boolValue];
    }
    @end
    

答案 2 :(得分:2)

我认为你已经得出结论,这不起作用。

@senojsitruc提出了几种不同的做法,但忽视了最简单的解决方案

[self.view.window.subviews setValue:[NSNumber numberWithBool:NO] forKey:@"userInteractionEnabled"]; 

NSArray州的文档:

  

<强>的setValue:forKey:

     

使用指定的值和键在每个数组项上调用setValue:forKey:。