我有一个 NSTableView ,我希望看到它空的时候看起来很漂亮。它看起来像这样:
我在自定义视图( _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];
}
编辑:添加屏幕截图以便澄清。
当表格视图包含项目时,它看起来像这样:
但是,当我删除最后一项并且TableView变空时,我希望它看起来像帖子顶部的屏幕截图。相反,它看起来像这样,直到我点击另一个选项卡并返回,或在另一个应用程序和后面等。然后它正确更新。
正如我所知,视图得到了正确添加,我已经检查过,只是应用程序没有正确重绘,直到做了一些让它重绘的东西(我的猜测)