[[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
等类型来完成?
答案 0 :(得分:3)
如果您只是希望您的代码能够运行,请投票并接受Paul.s的回答。如果你想阅读有关执行实验的书呆子,请继续。在我的原始答案的评论中有一些有趣的讨论,我在下面总结了这些讨论。
这不起作用。我在iOS项目中尝试过,userInteractionEnabled属性不受发送performSelector:withObject:
的影响。这与documentation匹配
NSObject声明:
aSelector应该标识一个采用id类型的单个参数的方法。对于具有其他参数类型和返回值的方法,请使用NSInvocation。
现在具有传奇色彩的Peter Hosey构建了一个样本基础工具here,当你传递一个双倍的时候,这个工具很有效,当我发现自己的时候也是浮动的。
为了增加好奇心的好奇心,这在iOS项目中不起作用(双重或浮动)。
总之,我认为我们可以说以下内容:
答案 1 :(得分:2)
你不能将NSNumber作为对象传递,并将它作为BOOL出现在另一端。但是,有一些解决方法。
使用NSInvocation。您需要创建一个使用NSInvocation的NSArray类别。这有点乱。
使用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:。