-1

当我尝试使用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'

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

4

3 回答 3

4

该参数名为withObject:。BOOL 不是对象,但nil可以传入,并且NO等价于它,因此您的第一个示例有效(偶然)。

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

于 2012-11-21T16:56:07.943 回答
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,但你可以使用任何现有的对象。这将是真的。

于 2012-11-21T17:18:07.870 回答
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];

希望有帮助!

于 2012-11-21T17:17:54.267 回答