Objective c 以编程方式使用子视图重画NSView
我有一个NSTableView,当它是空的时候,我想有一个好看的视图。看起来是这样的: 我已将TableView添加到具有相同大小的自定义视图\u superViewPackages中,然后将此代码添加到numberOfRowsInTableView函数中,以显示/隐藏覆盖:Objective c 以编程方式使用子视图重画NSView,objective-c,nstableview,nsview,Objective C,Nstableview,Nsview,我有一个NSTableView,当它是空的时候,我想有一个好看的视图。看起来是这样的: 我已将TableView添加到具有相同大小的自定义视图\u superViewPackages中,然后将此代码添加到numberOfRowsInTableView函数中,以显示/隐藏覆盖: if ( count == 0 && [[[_superViewPackages subviews] firstObject] isNotEqualTo:_viewOverlayPackages] ) {
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的多种组合,但都不起作用。我还将更新移到了它自己的方法中,并使用performselectornmainthread调用它来解决任何线程问题
我对Objective-C还比较陌生,所以对于经验丰富的人来说这可能是显而易见的,但在阅读和测试之后,我仍然找不到真正需要调用来更新的内容
现在,在添加最后一个约束后,我已经包含了以下代码:
[self performSelectorOnMainThread:@selector(updateView:) withObject:_viewOverlayPackages waitUntilDone:NO];
在withObject参数中,我尝试添加我能想到的所有视图,但没有一个有效
- (void)updateView:(NSView *)view {
NSLog(@"updateView %@", view);
[view setNeedsUpdateConstraints:YES];
[view updateConstraintsForSubtreeIfNeeded];
[view setNeedsLayout:YES];
[view layoutSubtreeIfNeeded];
[view setNeedsDisplay:YES];
[view display];
}
编辑:添加屏幕截图以进行澄清
当表视图包含项时,如下所示:
但是,当我删除最后一项,并且TableView变为空时,我希望它看起来像文章顶部的屏幕截图。相反,它看起来是这样的,直到我单击另一个选项卡并返回,或者单击另一个应用程序并返回等等,然后它才正确更新
正如我所知,视图被正确添加,我已经检查过了,只是应用程序没有正确地重新绘制,直到做了一些事情使其重新绘制所有内容。我猜。R你想用新值重新加载视图,对吗?是的,对不起,添加了更多的屏幕截图,以更清楚地显示我想要的内容。如果要重新加载视图,而不是先从超级视图中删除视图,然后用新数据读取视图,您是否可以尝试?显示/隐藏视图如何?不要移除它们。在数据源方法中也不要这样做。更好的地方是数据更改的地方,而不是当tableview要求更改时。谢谢Willeke,这很明显,老实说,我不知道我可以将视图设置为隐藏的,我可能过于关注我实现它的方式,因为它几乎可以工作。我在初始化中添加视图,并在将项插入表视图时将其设置为隐藏,表视图也从datasource方法中移动。因此,这是一个比我所做的更好的方法。非常感谢你!