我目前正在制作一个Cocoa网络客户端,它应该在从网络连接获取一些消息时修改一些NSView和NSTableView。
每当它从连接中获取消息时,除了刷新视图外,它都能正常运行。
我为NSTableView尝试了[tableView reloadData]
而没有效果。
我尝试了[view setNeedsDisplay:YES]
,[view setNeedsDisplayInRect:]
,[itsSuperView setNeedsDisplay:]
,但没有一个正在运作。
对象视图和tableView与IB正确链接,因为当用户点击按钮时调用reloadData
或setNeedsDisplay
工作正常。
当没有从GUI触发的方法中调用时,setNeedsDisplay
或reloadData
似乎没用......
你有任何提示吗?已经有几天我没有找到任何合适的解决方案而遇到这个问题...... 感谢
- 编辑:这是代码
@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 :(得分:0)
您是否在主线程上调用了setNeedsDisplay:
?
如果没有,您应该这样做:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html#//apple_ref/doc/uid/10000057i-CH12-123427
答案 1 :(得分:0)
我认为你必须使用
performSelectorOnMainThread:withObject:waitUntilDone:
这是因为只有主线程可以更改NSView视图。 SetNeedsDisplay等不会工作。在主线程上,您必须编写一个更改视图的方法,并使用选择器调用它。
以下是该方法的链接:performSelectorOnMainThread:withObject:waitUntilDone: