2011-04-23 53 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