以编程方式重新绘制带有子视图的NSView

时间:2015-09-25 21:06:25

标签: objective-c nstableview nsview

我有一个 NSTableView ,我希望看到它空的时候看起来很漂亮。它看起来像这样:

enter image description here

我在自定义视图( _superViewPackages )中添加了相同大小的TableView,然后将此代码添加到 numberOfRowsInTableView 函数以显示/隐藏叠加层:

if ( count == 0 && [[[_superViewPackages subviews] firstObject] isNotEqualTo:_viewOverlayPackages] ) {
        [_superViewPackages addSubview:_viewOverlayPackages positioned:NSWindowAbove relativeTo:nil];
        [_viewOverlayPackages setTranslatesAutoresizingMaskIntoConstraints:NO];
        NSArray *constraintsArray;
        constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:@"|-1-[_viewOverlayPackages]-1-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:NSDictionaryOfVariableBindings(_viewOverlayPackages)];
        [_superViewPackages addConstraints:constraintsArray];
        constraintsArray = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-1-[_viewOverlayPackages]-1-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:NSDictionaryOfVariableBindings(_viewOverlayPackages)];
        [_superViewPackages addConstraints:constraintsArray];
    } else if ( count > 0 && [[_superViewPackages subviews] containsObject:_viewOverlayPackages] ) {
        [_viewOverlayPackages removeFromSuperview];
    }

这样可行,但是当我删除tableView中的最后一项时,它不会更新,直到我再次单击另一个选项卡并再次返回,或者再次返回另一个应用程序,然后应用程序重新绘制所有内容。

我在多个不同的视图上尝试了多种 setNeedsDisplay setNeedsLayout setNeedsUpdateConstraints 的组合,但都没有。我还将更新移动到自己的方法,并使用 performSelectorOnMainThread 调用它来解决任何线程问题。

我对Objective-C相当新,所以对于经验丰富的人来说这可能是显而易见的,但在阅读和测试后,我仍然无法找到真正需要调用的内容来更新。

现在我在添加最后一个约束后包含了这段代码:

[self performSelectorOnMainThread:@selector(updateView:) withObject:_viewOverlayPackages waitUntilDone:NO];

withObject arg中,我尝试添加我能想到的所有视图,但没有一个有效。

- (void)updateView:(NSView *)view {
    NSLog(@"updateView %@", view);
    [view setNeedsUpdateConstraints:YES];
    [view updateConstraintsForSubtreeIfNeeded];
    [view setNeedsLayout:YES];
    [view layoutSubtreeIfNeeded];
    [view setNeedsDisplay:YES];
    [view display];
}

编辑:添加屏幕截图以便澄清。

当表格视图包含项目时,它看起来像这样:

enter image description here

但是,当我删除最后一项并且TableView变空时,我希望它看起来像帖子顶部的屏幕截图。相反,它看起来像这样,直到我点击另一个选项卡并返回,或在另一个应用程序和后面等。然后它正确更新。

enter image description here

正如我所知,视图得到了正确添加,我已经检查过,只是应用程序没有正确重绘,直到做了一些让它重绘的东西(我的猜测)

0 个答案:

没有答案