2012-11-21 68 views
-1

当我试着使用performSelectorOnMainThread此更改按钮的隐藏价值的作品:布尔值转换在IOS

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:NO waitUntilDone:YES]; 

但这:

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:YES waitUntilDone:YES]; 

给出了这样的错误:

Cannot initialize a parameter of type 'id' with an rvalue of type 'signed char' 

发生这种错误会发生什么样的内部转换?我该如何解决这个问题?

+0

读取(NULL)指针的时间... – 2012-11-21 17:22:38

回答

4

该参数被命名为withObject:。 BOOL不是一个对象,但可以传入nil,而NO与它相同,因此您的第一个示例可以正常工作(偶然)。

您有几个选择,但最简单的可能是使用GCD并改为在主线程的块中执行setHidden:方法。

0

如果你做这个测试:

NSArray *array = [NSArray arrayWithObjects:@"a", NO, @"b", nil]; 
NSLog("%@", array); 

你会发现,在数组中只有一个对象“A”,这意味着布尔值NO等于nil。所以实际上你的工作代码是这样的

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:nil waitUntilDone:YES]; 

这是可以接受的。

实际上,如果你做这个测试:

NSArray *array = [NSArray arrayWithObjects:@"a", [NSNumber numberWithBool:NO], @"b", nil]; 
NSLog("%@", array); 

,你会发现有三个对象数组: “A”, “0” 和 “B”。 所以在你的代码,你应该这样调用:

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:[NSNumber numberWithBool:YES/NO] waitUntilDone:YES]; 

希望帮助!

1

在performSelector方法中,您必须传递一个对象,如jrturton答案中所述。 但是...... BOOL类型不是原始类型有关BOOL

这里更多的信息:http://weblog.bignerdranch.com/564-bools-sharp-corners/

您可以使用这一招

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:nil waitUntilDone:YES]; // this is a setHidden:NO 

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:self waitUntilDone:YES]; // this is a setHidden:YES 

我用自己的,但你可以使用任何现有目的。这将是真实的。