怎么可能传递NSNumber给一个期望bool值的方法


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

我看到这段代码在另一个问题的答案(如何禁用触摸输入到所有视图除了最顶层的视图?),它让我感到惊讶,当它工作时,作为setUserInteractionEnabled:期望一个BOOL(因为它不是一个objective-c对象不能在performSelector:withObject:类型的方法中传递)。

说传递NSNumber没问题的文档在哪里?它是否适用于所有方法,还是需要一个特殊的实现?它只适用于BOOLs,还是可以使用int这样的类型?

如果你只是想让你的代码工作,投票和接受保罗。的回答。如果你想阅读关于书呆子做实验的文章,请继续阅读。在我最初的回答的评论中有一些有趣的讨论,我总结在下面。

这不起作用。我在一个iOS项目中尝试过,userInteractionEnabled属性不受发送performSelector:withObject:的影响。这与的文档相匹配NSObject的状态:

一个选择符应该识别一个只有一个id类型参数的方法。对于具有其他参数类型和返回值的方法,使用NSInvocation。

现在传奇的Peter Hosey在这里构建了一个示例基础工具,当你传递一个double给它时,它会奇怪地工作,我自己也发现了一个float。

为了增加好奇心,这在iOS项目(double或float)中不起作用。

总之,我认为我们可以这样说:

  • 如果它曾经工作过,它是偶然工作的,不应该依赖
  • 一个被接受或支持的堆栈溢出答案不一定是正确的

你不能传递NSNumber作为对象然后让它在另一端像那样作为BOOL输出。但是,有一些变通方法。

  1. 使用NSInvocation。你需要创建一个使用NSInvocation的NSArray类别。

  2. 创建一个与setUserInteractionEnabled:类似的函数(具有类似的名称?)的UIView类别,它与NSNumber一起操作,然后调用setUserInteractionEnabled:与NSNumber的BOOL值。比如:

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

我想你已经得出结论,这是行不通的。

@senojsitruc建议了几种不同的方法,但忽略了最简单的解决方案

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

NSArray state的文档:

setValue: forKey:

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

相关内容

最新更新