2011-07-12 105 views
2

爲了瞭解我在做什麼而沒有發佈代碼頁...我有一個NSOperation,我用它來處理添加到文件夾中的文件。在那個NSOperation中,我使用NSNotificationCenter來在任何新作業啓動時向NSView發送通知。這個想法是,我想添加一個新的子視圖來給我一些關於剛剛開始的工作的信息。問題是我似乎無法獲得新的子視圖來繪製。這是我現在所擁有的。NSView和動態加載子視圖

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSLog(@"Draw Count %i", [jobViewArray count]); 
    int i = 0; 
    while (i < [jobViewArray count]) { 
     [self addSubview:[jobViewArray objectAtIndex:i]]; 
    }  

} 

,然後進一步下跌:

-(void) newJobNotification: (NSNotification *) notification 
{ 
    if (!jobViewArray) 
      jobViewArray = [[NSMutableArray alloc] init]; 
    ++jobCount; 
    NSRect rect; 
    rect.size.width = 832; 
    rect.size.height = 120; 
    NSPoint point = { 0, ((jobCount * 120) - 120) }; 
    rect.origin = point; 
    ProgressView *newJob = [[ProgressView alloc] initWithFrame:rect]; 

    [jobViewArray addObject:newJob];  
    NSLog(@"Notice Count %i", [jobViewArray count]); 

    } 

} 

當我使用我的應用程序添加一個任務,該通知是正確的我的NSView接收時,子視圖中正確添加到jobViewArray,但後來當drawRect:再次被調用我的jobViewArray爲空。這是我第一次嘗試做這樣的事情,所以我可能在這裏做了一些完全錯誤的事情......我想這是因爲它不起作用吧?

+0

您的通知中的jobViewArray計數的日誌語句是否顯示您期望的內容? jobViewArray是一個屬性? – sosborn

+0

是的,在通知方法中,log語句返回的計數爲1,但後來在drawRect中返回0. jobViewArray是一個具有以下定義的屬性:@property(readwrite,copy)NSMutableArray * jobViewArray;' – Kris

+0

在通知將該日誌語句放在頂部。現在它總是會返回至少一個,因爲如果你不做任何工作,你總是創建一個jobArray。另外,iain是正確的,你不應該在drawRect中添加視圖。 – sosborn

回答

1

您不應該將子視圖添加到drawRect中的視圖中:.當您收到通知時,您應該在其中添加子視圖,因爲第二次通知出現時,您將添加2個子視圖,然後是下一個3個子視圖等等。

如果您在通知中添加子視圖,那麼您不需要混淆數組。

+0

我試圖將它添加到drawRect中:因爲我在某處讀取了不應該在drawRect之外繪製視圖:。每次調用通知時我都想要一個新的子視圖。對於子視圖的更新,我將有一個單獨的通知。我繼續在通知中放置一個'[self addSubview:newJob]'...但它仍然不繪製子視圖。我知道子視圖的代碼的工作原理,因爲如果我手動將它放入drawRect中:只要它打開,窗口就會將子視圖添加到窗口中。 – Kris

+0

好的,附加信息。我擺脫了我的工作ViewArray。在我的通知中,我現在有'[self addSubview:newJob]',然後是'NSLog(@「After Count%i」,[[self subviews] count])'這告訴我我有1個子視圖。當我在drawRect中調用相同的日誌語句時:它向我銷售我有0個子視圖。我不明白爲什麼我的子視圖在我的通知和drawRect之間消失:... – Kris

+0

當您調用addSubview時:它不繪製子視圖,它只是將其添加到父視圖。子視圖將自己調用drawRect:當它需要繪製時。你的通知是從一個單獨的線程或任何東西被調用?如果是這樣,你可能需要使用[self performSelectorOnMainThread:withObject:waitUntilDone:]並創建一個新的方法來實現addSubview:調用 – iain