【问题标题】:Objective-C: How to switch the NSView by button clickObjective-C:如何通过按钮单击切换 NSView
【发布时间】:2013-05-30 16:11:40
【问题描述】:

我有不同的带有 NSViewController 的 xib 文件。 (截图如下)

一个名为 StartMenuViewController 的 xib 文件,它有一个按钮。我想单击该按钮并将视图更改为 DetectingUSBViewController。(下面的屏幕截图) 该按钮的 IBAction 位于 StartMenuViewController.m 文件中。

我使用 AppController.m 来控制我的主 xib 视图。(NSWindow + NSView)(下面的屏幕截图)

当应用程序运行时,我尝试通过在我的 AppController.m 文件中执行以下操作来初始化 StartMenuViewController。

-(void)awakeFromNib{   
    [self initialize];
}

-(void) initialize
{
    @autoreleasepool {
        //mainViewController is a NSViewController and _mainView is a NSView which connect with Custom View in main xib
        self.mainViewController = [[[StartMenuViewController alloc]initWithNibName:StartMenuView bundle:nil]autorelease];
        [_mainView addSubview:[_mainViewController view]];
    }
}

它工作正常,它首先会在窗口上显示 StartMenuViewController.xib,但我不知道单击按钮后如何更改视图(查找 USB 驱动器)。我希望将当前视图更改为 DetectingUSBViewController.xib。

【问题讨论】:

    标签: objective-c macos cocoa nsview nsviewcontroller


    【解决方案1】:

    最简单的方法,假设您已正确绑定 USB 按钮,请执行以下操作:

    - (IBAction)usbButton:(UIButton *)sender {
    
        DetectingUSBViewController *second = [[DetectingUSBViewController alloc] initWithNibName:@"DetectingUSBView" bundle:nil];
        [self presentViewController:second animated:YES completion:nil];
    
    }
    

    【讨论】:

    • 这是mac还是ios?
    • 这适用于 iOS。不确定这是否也适用于 mac。
    • 不,它在 osx 上不起作用,因为没有 presentViewController 方法
    • 但该方法在其他方面是正确的。改为使用 addSubview
    【解决方案2】:

    startMenuViewController 中的DetectingUSBViewController 加载为DetectingUSBViewController* v1 = [[ViewCont1 alloc] initWithNibName:@"ViewCont1" bundle:nil]; 现在在您要添加/替换的视图中添加或替换视图为[v1 view]

    【讨论】:

      【解决方案3】:
      1. 您需要连接按钮才能发送 IBAction
      2. 您需要一个“用于检测 USBViewController.xib 的视图” => 一种方法(类似 iOS)是使用 ViewController。子类 NSViewController 然后分配初始化一个 DetectingUSBViewController
      3. 添加视图。不要展示 VC(因为 OSX 中没有这样的东西)

      //button click action
      - (IBAction)usbButton:(UIButton *)sender {
           //! Retain the VC
           Self.detectingUSBViewController = [[DetectingUSBViewController alloc] initWithNibName:@"DetectingUSBView" bundle:nil];
      
           //add the view
           [_mainView addSubview:[_detectingUSBViewController view]];
      

      }

      【讨论】:

      • _mainView 在 AppController 类而不是 StartViewController 类中。如何在这里调用_mainView?谢谢
      猜你喜欢
      • 2012-12-19
      • 2018-07-22
      • 2017-09-23
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多