objective-c – 强制NSView以编程方式重绘

我的应用程序有两种不同的状态,每个状态都代表一个NSView.

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

搜索了这个问题,并提供了多个解决方案,但没有任何对我有用:

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


[mySubView1 setHidden:YES]; || [mySubView1 removeFromSuperView];

我甚至将myView定义为Outlet,但没有任何效果.

这是我的代码

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

解决方法

我发现它,代码很好,无需调用任何重绘方法,唯一的问题任何UI操作都需要在MAIN线程中完成

所以最终的代码是:

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];
    }
});

多谢你们.

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...