Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 以编程方式使用子视图重画NSView_Objective C_Nstableview_Nsview - Fatal编程技术网

Objective c 以编程方式使用子视图重画NSView

Objective c 以编程方式使用子视图重画NSView,objective-c,nstableview,nsview,Objective C,Nstableview,Nsview,我有一个NSTableView,当它是空的时候,我想有一个好看的视图。看起来是这样的: 我已将TableView添加到具有相同大小的自定义视图\u superViewPackages中,然后将此代码添加到numberOfRowsInTableView函数中,以显示/隐藏覆盖: if ( count == 0 && [[[_superViewPackages subviews] firstObject] isNotEqualTo:_viewOverlayPackages] ) {

我有一个NSTableView,当它是空的时候,我想有一个好看的视图。看起来是这样的:

我已将TableView添加到具有相同大小的自定义视图\u superViewPackages中,然后将此代码添加到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的多种组合,但都不起作用。我还将更新移到了它自己的方法中,并使用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方法中移动。因此,这是一个比我所做的更好的方法。非常感谢你!