-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

jrturtonの回答で述べたように、 performSelector メソッドではオブジェクトを渡す必要があります。しかし... 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」というオブジェクトが 1 つしかないことがわかります。これは、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」の 3 つのオブジェクトがあることがわかります。したがって、コードでは、次のように呼び出す必要があります。

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

それが役立つことを願っています!

于 2012-11-21T17:17:54.267 に答える