【问题标题】:Xcode single window, display custom view from xib fileXcode 单窗口,显示来自 xib 文件的自定义视图
【发布时间】:2015-03-14 13:35:46
【问题描述】:

我正在创建一个 OSX 应用程序,它有一个窗口。此窗口包含一个视图,在整个使用过程中呈现不同的视图。

我目前的做法:

  • 在默认的 MainMenu.xib 中,我为默认生成的窗口(我将使用的窗口)中的自定义视图创建了一个出口。我们就叫它MainView吧。

  • 我创建了一个带有 xib 文件的视图控制器。在 xib 中,我为它创建了一个视图和一个出口。我们称之为CustomView1。稍后我将在此视图控制器中拥有多个视图。

  • AppDelegate.h 中,我导入了视图控制器,并将其分配如下: @property (strong, nonatomic) MasterViewController *masterViewController;

  • AppDelegate.mapplicationDidFinishLaunching 我尝试显示自定义视图: _MainView = _masterViewController.CustomView1;

目前这会导致一个空窗口。我怀疑我正在以错误的方式解决这个问题。最好的方法是什么?

【问题讨论】:

标签: objective-c xcode macos cocoa view


【解决方案1】:

该项目位于 Github https://github.com/MacUserT?tab=repositories

我还在存储库中添加了该应用程序,因此您可以直接从您的文件夹中运行它。如果你下载了这个项目,你应该可以在 xcode 中打开它,编译并运行它。您应该得到与我上传的应用程序相同的结果。

我希望这会有所帮助并且有效。

亲切的问候, Mac用户T

【讨论】:

    【解决方案2】:

    您的错误是您最初没有显示您的第一个视图。这是我学习如何在窗口内外交换视图的方法。这是否是最好的方法,不取决于我。您的方法的不同之处在于您应该将视图与窗口分离。可能有更好的方法,但官方教授了以下方法。

    使用您的 mainmenu.xib 作为窗口控制器。在窗口中放置一个框并将框边框设置为无。您将拥有一个不可见的盒子,它将成为您的视图的容器。

    创建尽可能多的视图控制器,以获得不同的视图。当然,这是通过创建一个新类作为 NSViewController 的子类来实现的。在您的主类(可能是 appDelegate,但它可以是其他类)中,您至少创建一个 NSBox 的 IBOutlet(您在主窗口中放置的框)和一组视图控制器。后者将包含您要显示的所有视图。

    这是一个简单的示例,向您展示它是如何工作的:

    appDelegate.h 包含以下声明:

    @interface AppDelegate : NSObject <NSApplicationDelegate>
    
    
    @property (weak) IBOutlet NSButton *swapViewButton;
    @property (weak) IBOutlet NSBox *viewBox;
    @property NSMutableArray *viewControllers;
    @property NSUInteger currentView;
    
    -(IBAction)swapViewOnButtonclick:(id)sender;
    -(void)displayViewController:(NSViewController *)vc;
    
    @end
    

    appDelegate.m 包含以下方法:

    #import "AppDelegate.h"
    #import "FirstViewController.h"
    #import "SecondViewController.h"
    
    @interface AppDelegate ()
    
    @property (weak) IBOutlet NSWindow *window;
    @end
    
    @implementation AppDelegate
    
    @synthesize viewControllers;
    @synthesize currentView;
    
    -(id)init
    {
        self = [super init];
        if(self)
        {
            viewControllers = [[NSMutableArray alloc]init];
    
            NSViewController *vc;
    
            vc = [[SecondViewController alloc]init];
            [viewControllers addObject:vc];
    
            vc = [[FirstViewController alloc]init];
            [viewControllers addObject:vc];
        }
    
        NSLog(@"The number of views in the view controller array is: %ld.\n", [viewControllers count]);
        return self;
    }
    
    -(void)displayViewController:(NSViewController *)vc
    {
        NSWindow *w = [_viewBox window];
        BOOL ended = [w makeFirstResponder:w];
        if(!ended)
        {
            NSBeep();
            return;
        }
    
        NSView *v = [vc view];
        [_viewBox setContentView:v];
    }
    
    
    -(IBAction)swapViewOnButtonclick:(id)sender
    {
        if(!currentView)
        {
            currentView++;
        }else
        {
            currentView = 0;
        }
        NSLog(@"Current view is: %ld.\n", currentView);
        NSViewController *vc = [viewControllers objectAtIndex:currentView];
        [self displayViewController:vc];
    }
    
    -(void)awakeFromNib
    {
        currentView = 0;
        [self displayViewController:[viewControllers objectAtIndex:currentView]];
    }
    
    @end
    

    视图控制器是相似的,只是在示例中有一个初始化器。我在视图上放置了一个带有文本“第一/第二视图”的文本标签。当然,这只是视图交换如何工作的一个示例。您可以根据应用程序的需要使其复杂化。希望这会有所帮助。

    MacUserT

    【讨论】:

    • 嗨@MacUserT,感谢您的回答。除了视图没有切换外,我可以让一切正常工作。它从不显示第二个视图控制器,我什至将FirstViewController 切换为SecondViewController,所以两者都是第二个视图控制器,但由于某种原因,只有第一个视图控制器显示,即使它从未初始化。
    • 嗨,Orange Peel,这很有趣,因为它可以在我的电脑上运行。你知道我是否可以在这个网站上发布文件吗?否则,我将在 Git 或其他地方分享它。然后你就可以测试我的项目了。
    • 请务必发布 git。很奇怪,如果我删除第一个视图控制器,就会显示第二个视图控制器。
    • 嗨橙皮。该项目在 Github github.com/MacUserT?tab=repositories
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2014-03-14
    • 2013-05-05
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多