【问题标题】:Refreshing views after a non-graphical event非图形事件后刷新视图
【发布时间】:2011-04-23 15:18:11
【问题描述】:

我目前正在制作一个 Cocoa 网络客户端,当它从其网络连接中获取一些消息时,它应该修改一些 NSViews 和 NSTableViews。

每当它从连接中获取消息时,它都会做的一切都很好,除了刷新视图。 我为 NSTableView 尝试了[tableView reloadData],但没有效果。 我试过[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

【问题讨论】:

  • 接收消息的对象有到表视图的出口吗?你在使用后台线程吗?
  • 实际上,我将reloadData 消息直接发送到表视图。而从主线程([NSThread isMainThread]return YES)...
  • 哪个对象正在发送reloadData?网络消息接收者?其他控制器?按下按钮时发送reloadData 的对象是同一个对象吗?该对象是否拥有网络消息接收器?我要问的是,该消息接收者对象与reloadData 调用之间的关系是什么?
  • 我有一个 MyWindowController,它是我的网络接收器的委托类。每当一条消息到达时,它就会被路由到 MyWindowController,它会解析它,修改几个数组,然后发送[myTableView reloadData],其内容应该根据这些数组而改变。在 myWindowController 中,我有 IBOutlet NSTableView *myTableView-(IBAction)clic:(id)sender(它也发送 [myTableView reloadData])。然而,当从 -clic: 发送 reloadData 消息时,它会正确更新其视图,但在 myWindowController 解析消息后发送时不会。
  • 好的,我认为您必须发布导致reloadData 调用失败的代码。另外,表视图是如何获取数据的?绑定还是数据源?如果是数据源,哪个对象实现了这些方法?

标签: cocoa


【解决方案1】:

【讨论】:

  • 正如 George Sachin 所发布的,您可以使用 performSelectorOnMainThread:。你能发布应该触发更新的帖子吗?
【解决方案2】:

我认为你必须使用 performSelectorOnMainThread:withObject:waitUntilDone:

那是因为只有主线程才能改变 NSView 视图。 SetNeedsDisplay 等不起作用。在主线程上,您必须编写一个更改视图的方法,并使用选择器调用它。

这里是方法的链接:performSelectorOnMainThread:withObject:waitUntilDone:

【讨论】:

  • 不幸的是,网络事件已经在主线程中处理(我的 WindowController 是网络的委托,[NSThread isMainThread]returns YES)...我尝试了你的建议,但它没有帮助:-/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2016-05-07
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多