2011-04-23 49 views
2

我目前正在製作一個Cocoa網絡客戶端,當它從網絡連接中收到一些消息時,它應該修改一些NSViews和NSTableViews。非圖形事件後刷新視圖

每當它從連接中獲取消息時,它都會很好,除了刷新視圖。 我試過[tableView reloadData] NSTableView沒有效果。 我試過[view setNeedsDisplay:YES][view setNeedsDisplayInRect:][itsSuperView setNeedsDisplay:],但他們都沒有工作。

對象視圖和tableView與IB正確鏈接,因爲當用戶單擊按鈕時調用reloadDatasetNeedsDisplay工作正常。 看起來像setNeedsDisplayreloadData沒有從GUI觸發的方法調用時沒用...

你有任何提示嗎?這是一個對夫婦,我有這個問題幾天都沒找到合適的解決方案... 感謝

- 編輯:這裏是代碼

@implementation myWindowController 
- (id)init{ 
    self = [super initWithWindowNibName:@"ListWindow"]; //Form ListWindow.xib 
    return self; 
} 

- (void)windowDidLoad 
{ [super windowDidLoad]; 
} 


//From button in the GUI 
- (IBAction)refresh:(id)sender{ 
    [tableProcessus reloadData]; //Actually refreshes the tableView 
} 


//Form network 
- (void)handleIncomingText:(NSString *)str{  
    if([str isEqualToString:@"add an item"]){ 
     [glob addItem:3];   //glob is a custom array 
     [tableProcessus reloadData]; //Does nothing visible (doesn't even trigger numberOfRowsInTableView:) 
    } 
} 


#pragma mark tableProcessus Data source 
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView{ 
    return [glob numberOfItems]; 
} 

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex{ 
    return [glob itemAtIndex:rowIndex]; 
} 

@end 
+0

接收具有出口表視圖的消息的對象?你是否使用後臺線程? – 2011-04-23 17:18:36

+0

實際上,我將'reloadData'消息直接發送到表視圖。並從主線程([NSThread isMainThread]'return'YES')... – Daladim 2011-04-23 18:27:02

+0

哪個對象正在發送'reloadData'?網絡訊息接收器?其他一些控制器?這是否是按下按鈕時發送'reloadData'的對象?該對象是否擁有網絡消息接收器?我問的是,那個消息接收器對象和'reloadData'調用之間的關係是什麼? – 2011-04-23 19:03:38

回答

0
+0

不幸的是,是的......我真的不明白它...... – Daladim 2011-04-23 18:25:11

+0

正如George Sachin所發佈的,你可以使用performSelectorOnMainThread :.你能發佈應該觸發更新嗎? – 2011-04-23 20:25:32

0

我認爲你必須使用 performSelectorOnMainThread:withObject:waitUntilDone:

那是因爲只有主線程可以改變的NSView視圖。 SetNeedsDisplay等不會工作。在主線程上,你必須編寫一個方法來改變視圖,並使用選擇器來調用它。

下面是該方法的鏈接:performSelectorOnMainThread:withObject:waitUntilDone:

+0

不幸的是,網絡事件已經在主線程中處理過了(我的WindowController是網絡的委託,'[NSThread isMainThread]'返回'YES')...我嘗試了你所建議的一切,但沒有幫助: - / – Daladim 2011-04-23 18:24:03