0

UIBarButtonItemでいくつかの作業を行った後、の有効なプロパティを変更しようとしていNSThreadます。ボタンを押した後、有効を NO に設定し、スレッド部分を実行し、最後にボタンを再度有効にしようとします。かなり基本的。

どういうわけかこれは失敗しますが、UIBarButtonItem の他のプロパティを正しく変更することができます (例: タイトル)。

ここで何が間違っていますか?

@interface myViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    IBOutlet UIBarButtonItem *myButton;

}
@property (nonatomic, retain) IBOutlet UIBarButtonItem *myButton;

- (IBAction)mysub:(id)sender;

@end



@implementation myViewController

@synthesize myButton;

- (IBAction)mysub:(id)sender {
 [myButton setEnabled:NO];

    [NSThread detachNewThreadSelector:@selector(mysub_threaded) toTarget:self withObject:nil];    
}

- (void) mysub_threaded {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    … do threaded stuff

    [myButton performSelectorInBackground: @ selector(setEnabled :) withObject: [NSNumber numberWithBool:YES]];

    [pool drain];
}
4

1 に答える 1

2

performSelectorOnMainThread代わりに欲しい。

[myButton performSelectorOnMainThread:@selector(setEnabled:)
                           withObject:[NSNumber numberWithBool:YES]
                        waitUntilDone:NO];

メイン スレッドで UI に触れることは常に実行します。

しかし、このように引数を渡すことも時々ファンキーです。必要なすべてを別の方法でまとめるのが最善だと思います

- (void)mysub_complete {
  [myButton setEnabled:YES];
}

次に、それを呼び出します

[self performSelectorOnMainThread:@selector(mysub_complete)
                       withObject:nil
                    waitUntilDone:NO];

これで、心配することなく、必要なだけ他の UI 操作を行うことができます。

于 2010-08-06T16:46:09.583 に答える