Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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_Macos_Cocoa_Nsview - Fatal编程技术网

Objective c 强制NSView以编程方式重新绘制

Objective c 强制NSView以编程方式重新绘制,objective-c,macos,cocoa,nsview,Objective C,Macos,Cocoa,Nsview,我的应用程序有两种不同的状态,每个状态都将用NSView表示 所以一次只显示一个视图,问题是当我在视图之间切换时,应用程序不会显示新状态,直到我手动调整窗口大小 我搜索了这个问题,找到了不止一个解决方案,但没有任何效果: [myView setNeedsDisplay:YES]; [myView display]; [[myView.window contentView] setNeedsDisplay:YES]; [mySubView1 setHidden:YES]; || [mySubV

我的应用程序有两种不同的状态,每个状态都将用NSView表示

所以一次只显示一个视图,问题是当我在视图之间切换时,应用程序不会显示新状态,直到我手动调整窗口大小

我搜索了这个问题,找到了不止一个解决方案,但没有任何效果:

[myView setNeedsDisplay:YES];
[myView display];
[[myView.window contentView] setNeedsDisplay:YES];


[mySubView1 setHidden:YES]; || [mySubView1 removeFromSuperView];
我甚至将我的观点定义为出口,但没有任何效果

这是我的密码

if (appState == 1) {

    [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 250)];

    [self.mySubView1 setHidden:NO];
    [self.mySubView2 setHidden:YES];

    [self.mySubView2 removeFromSuperview];
    [self.mySubView1 addSubview:self.inCallView];
}
else
{
    [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 70)];

    [self.mySubView1 setHidden:YES];
    [self.mySubView2 setHidden:NO];

    [self.mySubView1 removeFromSuperview];
    [self.mySubView2 addSubview:self.chatHeaderView];
}
// I need to redraw here
[self.view setNeedsDisplay:YES];
[self.mySubView1 setNeedsDisplay:YES];
[self.mySubView2 setNeedsDisplay:YES];
// and nothing happened until I resize my window manually 

执行子视图删除或添加操作将自动调用
setNeedsDisplay:YES
,因此手动调用它毫无效果也就不足为奇了

一些需要检查的事项:

  • 检查视图属性是否为零。我看到您正在删除视图,这将导致superview释放它,如果您没有使用强属性(或其他地方)保留它,它将被释放
  • 确保您没有与autolayout发生冲突。暂时关闭自动布局,以确认它不会导致您的问题
  • 您只需设置帧大小。您还需要确保它具有预期的来源

  • 另外,如果您正在删除视图,则无需费心调用setHidden:

    我找到了它,代码很好,无需调用任何重画方法,唯一的问题是任何UI操作都需要在主线程中执行

    因此,最终代码将是:

    dispatch_async( dispatch_get_main_queue(), ^{
        if (appState == 1) {
            [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 250)];
    
            [self.mySubView1 setHidden:NO];
            [self.mySubView2 setHidden:YES];
        }
        else
        {
            [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 70)];
    
            [self.mySubView1 setHidden:YES];
            [self.mySubView2 setHidden:NO];
        }
    });
    

    谢谢,伙计们。

    设置需要显示:是的
    是正确的方法。我尝试了,但遗憾的是没有成功:(请使用它,并显示代码在何处使用,有人可以从那里拿走,我确定。谢谢Brad,我再次检查了所有的点;我想告诉大家,当我手动调整窗口大小时,一切都很好(窗口自己重新绘制)。是的,不需要设置隐藏-我将删除它-,再次感谢:)不,问题是我必须手动调整窗口大小才能得到结果。这意味着它不是零;自动布局和原点与预期一样。只想在不让用户更改窗口大小的情况下重新绘制它