当我尝试使用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'
创建此错误会发生什么样的内部转换?我该如何解决这个问题?
答案 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];
希望有所帮助!