2010-08-06 70 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