[[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输出。但是,有一些变通方法。
-
使用NSInvocation。你需要创建一个使用NSInvocation的NSArray类别。
-
创建一个与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:。