非图形事件后刷新视图

时间:2011-04-23 15:18:11

标签: cocoa

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

每当它从连接中获取消息时,除了刷新视图外,它都能正常运行。 我为NSTableView尝试了[tableView reloadData]而没有效果。 我尝试了[view setNeedsDisplay:YES][view setNeedsDisplayInRect:][itsSuperView setNeedsDisplay:],但没有一个正在运作。

对象视图和tableView与IB正确链接,因为当用户点击按钮时调用reloadDatasetNeedsDisplay工作正常。 当没有从GUI触发的方法中调用时,setNeedsDisplayreloadData似乎没用......

你有任何提示吗?已经有几天我没有找到任何合适的解决方案而遇到这个问题...... 感谢

- 编辑:这是代码

@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

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

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

这是因为只有主线程可以更改NSView视图。 SetNeedsDisplay等不会工作。在主线程上,您必须编写一个更改视图的方法,并使用选择器调用它。

以下是该方法的链接:performSelectorOnMainThread:withObject:waitUntilDone: