2010-05-27 79 views
1

我得到這個代碼:無法從委託訪問用戶界面?

GrooveOnDownload *dlg = [[GrooveOnDownload alloc] init]; 

NSURLDownload *dw = [[NSURLDownload alloc] initWithRequest:request delegate:dlg]; 

它開始下載在委託類網點UI控件。但由於某些原因,控件不會響應來自代理的直接消息。

//Header of the delegate 
@interface GrooveOnDownload : NSObject { 
IBOutlet id downloadButton; 
//... 

//Implementation 
//... 
[downloadButton setEnabled:FALSE]; // Doesn't work 
//... 

任何想法?

這是我的Mac開發第四天,所以我不太瞭解這個平臺。

編輯: 2010-05-28 01:03:41.486 GrooveOnLite [3303:A0F]下載按鈕=(空)

編輯2:

alt text http://i47.tinypic.com/ermqdx.png

編輯3: 我想念Windows .....

編輯4 在Win32中,您向該按鈕發送一個窗口消息。一切都由WndProc循環處理。這是該死的簡單。在Mac中,你有這個神奇的界面生成器,以某種方式獲得所有的廢話工作。代表被一些魔術師召喚。其餘的課程由一些「神奇」力量聯繫起來。在windows中有一個功能,它是入口點。而已!沒有任何延遲的網點和這樣的狗屎。

+0

該請求確實有效,它確實下載了該文件,但我無法從委託中訪問進度欄和按鈕。 – 2010-05-27 23:48:36

+1

在調用'setEnabled:'的行上設置一個斷點。確保'downloadButton'實際上是一個按鈕對象的實例,就像您期望的一樣。 – 2010-05-28 00:00:30

+0

你的截圖使得它看起來像事情設置正確。你確定在兩種情況下GrooveOnDownload對象都是相同的嗎?你的代碼示例使它看起來像你正在創建一個新的實例,它不會有這些連接。 – 2010-05-28 00:11:23

回答

3

我知道這聽起來很明顯,但在Interface Builder中是否正確連接了所有東西?

編輯

如果下載的是一個單獨的線程,然後fbrereto是正確的,你需要在主線程中進行選擇。您的代碼將需要改變,看起來像這樣:

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

的幾個注意事項:在Objective-C關鍵字NO是用來代替FALSE。這是一個原始類型,所以爲了在這裏使用它,我們必須將它放在一個NSNumber對象中。 waitUntilDone參數完全符合您的預期,如果您不想等待,可以將其更改爲NO

編輯2

下面是有關如何完成什麼,我想你想,這是從你的應用程序委託重用GrooveOnDownload的單個實例更完整的代碼示例。我假設你的應用程序委託類叫做GrooveOnLiteAppDelegate。

// GrooveOnLiteAppDelegate.h 
@interface GrooveOnLiteAppDelegate : NSObject 
{ 
    IBOutlet GrooveOnDownload *grooveOnDownload; 
    // other properties go here 
} 

// your method signatures go here 
@end 

// GrooveOnLiteAppDelegate.m 
@implementation GrooveOnLiteAppDelegate 

- (void)mySuperAwesomeMethod 
{ 
    // it's up to you to figure out what method to put this in and 
    // how to call it 
    NSURLDownload *dw = [[NSURLDownload alloc] initWithRequest:request delegate:grooveOnDownload]; 
} 

@end 

鑑於您的應用程序委託的代碼,你必須在IB的插座可以連接到您的IB對象GrooveOnDownload。如果你這樣做,那麼grooveOnDownload將是一個指向該對象的指針。

+0

兩個出口都設置在界面生成器,一個進度條和一個按鈕。我敢肯定,一切是正確的。 – 2010-05-27 23:49:33

+0

不工作...按鈕處於啓用 – 2010-05-27 23:58:18

+0

添加一行如'NSLog(@「下載按鈕=%@」,downloadButton);'如果它出現爲'(null)',那麼downloadButton設置不正確 – 2010-05-27 23:59:47

3

所有UI調用必須在主線程上進行;如果下載發生在後臺,您的委託可能會在主線程以外的線程上得到通知,在這種情況下,需要通過類似-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:modes:或其他相關API的方式調用UI元素。

+0

我可以通過這種方式訪問​​我的按鈕嗎? – 2010-05-27 23:50:32

+0

[downloadButton performSelectorOnMainThread:@selector(setEnabled :) withObject:[NSNumber numberWithBool:NO] waitUntilDone:NO] – 2010-05-27 23:58:00

+0

這兩個都不是:( – 2010-05-27 23:59:17