【发布时间】:2011-04-23 15:18:11
【问题描述】:
我目前正在制作一个 Cocoa 网络客户端,当它从其网络连接中获取一些消息时,它应该修改一些 NSViews 和 NSTableViews。
每当它从连接中获取消息时,它都会做的一切都很好,除了刷新视图。
我为 NSTableView 尝试了[tableView reloadData],但没有效果。
我试过[view setNeedsDisplay:YES]、[view setNeedsDisplayInRect:]、[itsSuperView setNeedsDisplay:],但都没有工作。
虽然对象视图和 tableView 与 IB 正确链接,因为当用户单击按钮时调用 reloadData 或 setNeedsDisplay 工作正常。
看起来 setNeedsDisplay 或 reloadData 在不从 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
【问题讨论】:
-
接收消息的对象有到表视图的出口吗?你在使用后台线程吗?
-
实际上,我将
reloadData消息直接发送到表视图。而从主线程([NSThread isMainThread]returnYES)... -
哪个对象正在发送
reloadData?网络消息接收者?其他控制器?按下按钮时发送reloadData的对象是同一个对象吗?该对象是否拥有网络消息接收器?我要问的是,该消息接收者对象与reloadData调用之间的关系是什么? -
我有一个 MyWindowController,它是我的网络接收器的委托类。每当一条消息到达时,它就会被路由到 MyWindowController,它会解析它,修改几个数组,然后发送
[myTableView reloadData],其内容应该根据这些数组而改变。在 myWindowController 中,我有IBOutlet NSTableView *myTableView和-(IBAction)clic:(id)sender(它也发送[myTableView reloadData])。然而,当从 -clic: 发送 reloadData 消息时,它会正确更新其视图,但在 myWindowController 解析消息后发送时不会。 -
好的,我认为您必须发布导致
reloadData调用失败的代码。另外,表视图是如何获取数据的?绑定还是数据源?如果是数据源,哪个对象实现了这些方法?
标签: cocoa