将 BOOL 传递给 makeObjectsPerformSelector:withObject:
Posted
技术标签:
【中文标题】将 BOOL 传递给 makeObjectsPerformSelector:withObject:【英文标题】:Passing BOOL to makeObjectsPerformSelector:withObject: 【发布时间】:2011-03-21 07:18:31 【问题描述】:我想将 BOOL 作为参数传递给[NSArray makeObjectsPerformSelector:withObject:]
。例如
[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: NO];
上面的代码不起作用,因为 withObject 只接受 id。
正确的做法是什么?
我看到了一些这样的代码:
[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: (id)kCFBooleanTrue];
[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: (id)kCFBooleanFalse];
这在 4.2 模拟器上运行良好,但在 4.2 iphone 上失败。
【问题讨论】:
【参考方案1】:您可以编写一个 UIButton(甚至 UIView)类别,让您可以将 setEnabled: 与对象一起使用。
@interface UIButton(setEnabledWithObject)
- (void)setEnabledWithNSNumber:(NSNumber *)bNum;
@end
@implementation UIButton(setEnabledWithObject)
- (void)setEnabledWithNSNumber:(NSNumber *)bNum
[self setEnabled:[bNum boolValue]];
@end
然后你可以使用
[buttons makeObjectsPerformSelector:@selector(setEnabledWithNSNumber:) withObject:[NSNumber numberWithBool:NO]];
[buttons makeObjectsPerformSelector:@selector(setEnabledWithNSNumber:) withObject:[NSNumber numberWithBool:YES]];
【讨论】:
谢谢!这将起作用。我希望他们有更简单的方法。【参考方案2】:我记得除了withObject:@YES
之外,我还必须做点别的事情,但由于我再也找不到它了,我发现它也适用于
[buttons enumerateObjectsUsingBlock:^(NSButton *item, NSUInteger idx, BOOL *stop)
[item setEnabled:YES];];
或者更快/更老/更易读的:)方式:
for (NSButton *item in buttons) [item setEnabled:YES];;
应该知道 enumerateObjectsUsingBlock 并不是特别快,但无论如何它不应该是一个巨大的杀手 :) 如果你想要快,你也可以使用 for (;;)
块来做到这一点,当然 :)
【讨论】:
【参考方案3】:请看以下重复的问题:
How to use performSelector:withObject:afterDelay: with primitive types in Cocoa?。
Using performSelector:withObject:afterDelay: with non-object parameters
SEL performSelector and arguments
希望对你有帮助。
【讨论】:
【参考方案4】:如果您在静态中传递 BOOL 参数,那么我在 link
中的回答会有所帮助..
【讨论】:
以上是关于将 BOOL 传递给 makeObjectsPerformSelector:withObject:的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能直接将 int 或 bool 传递给 OCMock 的“andReturnValue”参数?
如何在 Objective-C 中将 BOOL 变量作为参数传递?