2010-08-06 71 views
0

我试图在NSThread中做一些东西后,更改UIBarButtonItem的启用属性。按下按钮后,我将启用设置为否,然后执行螺纹部分,最后我尝试重新启用按钮。相当基本。iPhone UIBarButtonItem setEnabled in NSThread

不知何故这失败,但我可以正确地更改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]; 
} 
+0

setEnabled:需要一个BOOL,而不是NSNumber *。 – 2010-08-06 17:47:52

+0

tc。那么,将BOOL参数传递给performSelectorOnMainThread而不是使用NSNumber的正确方法是什么? – Tomas 2010-08-06 19:46:45

回答

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的东西。

+0

我刚刚用一个更强大的方法修改了我的答案。如果这不起作用,你将不得不澄清究竟“没有工作”的含义。错误?您设置的新值会被忽略?如果这不起作用,您可能会在其他地方发现错误。 – 2010-08-06 17:16:17

+0

答案的第二部分工作得很好(称为mysub_complete),谢谢! 但是,让我添加以下内容:最初我使用performSelectorOnMainThread(performSelectorInBackground只是数千次试验之一的剩余部分),但它不起作用(按钮不能重新使用)。任何想法为什么? – Tomas 2010-08-06 17:21:21

+0

有时可以使用'withObject:[NSNumber numberWithBool:YES]'来代替简单的'YES'。 'performSelectorOnMainThread'被设计用来获取单个对象参数,非对象参数的行为有些不确定。所以最好避免它。 – 2010-08-06 17:47:36