Bool在iOS中重视转换

时间:2012-11-21 16:50:05

标签: ios ios6

当我尝试使用performSelectorOnMainThread更改按钮的隐藏值时,这可以正常工作:

[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'

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

3 个答案:

答案 0 :(得分:4)

该参数名为withObject:。 BOOL不是一个对象,但nil可以传入,NO等同于它,所以你的第一个例子是有效的(偶然)。

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

答案 1 :(得分: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

我使用过self,但你可以使用任何现有的对象。它将是真的。

答案 2 :(得分:0)

如果你做这个测试:

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

你会发现在数组中只有一个对象“a”,这意味着bool值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];

希望有所帮助!