zoukankan      html  css  js  c++  java
  • MACOS 答题器,界面跳转

    国内OSX开发的资料实在少,甚至连一本开发的书都找不到…

    更无语的是,苹果自家的开发文档Sample Code不仅还停留在OC版本,还是MRC的…

    在这样的情况下,OSX开发还真得靠“想象力”…

    网上有Demo关于随机数,取色器等,基本就是一个Class就能搞定的。

    比如https://github.com/fancymax/Cocoa-Learning这里面的几个demo都是类似的实现单界面的某个小功能。

    这篇博客分享下我关于窗口跳转的心得。

    1.首先必须要明确的关系:NSWindowController,NSWindow,NSViewController,NSView

    在iOS里,只有一个Window,但OSX里有多个Window,所以增加了NSWindowController

    从范围上来讲,NSWindowController>NSWindow>NSViewController>NSView

    稍微专业一点的关系图:

    2.如何创建一个Window:

    Window一般都依附于WindowController,所以需要创建Window,如果不借助于Storyboard的话,需要创建一个WindowController,代码如下:

    下面这个例子模拟点击一个按钮,创建新的窗口。(假如把代码写在APPdelegate里,就会在启动时自动新建这个窗口)

    这里有个非常大的坑,我被坑了很久,看似一样的代码,但局部变量创建的WindowController对象是就是显示不出Window的。谁知道可以给我科普下…

    var settingWinC:SettingWindowController?
    
    @IBAction func settingButtonClick(sender: AnyObject) {
            //新建窗口
            settingWinC=SettingWindowController()
            settingWinC!.showWindow(nil);
    
            //用局部变量是无法显示窗口的!!!至于为什么!!可能和对象的内存管理有关!
    //        var settingWC=SettingWindowController()
    //        settingWC.showWindow(nil);
    }

    3.如何在某个Window内进行View的跳转?(假如在ViewController中,你得先取得当前的Window)

    (方法1)赋值给ContentView

    因为每一个Window都会有一个ContentView,所以我的做法是直接把你准备好的View直接赋值给ContentView。

    假如你的View来自某个其他的ViewController,这里就会有个需要注意的坑。和上面一样,假如你的是临时变量,这个ViewController中的Button的响应事件是会崩溃的…

    你可以这样来替换contentView

    var testVC:TestingViewController?
    @IBAction func startButtonClick(sender: AnyObject) {
        testVC=TestingViewController()
        self.view.window?.contentView=testVC!.view
    }

    或者,你需要把这个ViewController加入到这个Window的.contentViewController?.addChildViewController里。

    这个可能和event loop机制有关吧。

    let testVC=TestingViewController()
    //同一个Window内,直接替换contentView显示
    //必须要把下一个ViewController先加到window的contentViewController里,否则其上的按钮事件都会报错
    self.view.window?.contentViewController?.addChildViewController(testVC)
    self.view.window?.contentView=testVC.view

    (方法2)覆盖到ContentView

    也可以用contentView.addSubview()的方式在其上添加其他View。

    总的来说,这部分跳转都是需要手动控制View的,并没有一些如NavigationController之类的让你Push和Pop。

    4.如何在ViewController中,以新Window的方式显示某个View?

    present就是能以新Window显示View的,它的效果如下

    var testVC:TestingViewController?
        @IBAction func startButtonClick(sender: AnyObject) {
            testVC=TestingViewController()
            self.presentViewControllerAsModalWindow(testVC!)
    }

    presentViewControllerAsModalWindow:

    presentViewControllerAsSheet:(动画效果从上到下下拉出来,这里有2个窗口)

    demo:https://github.com/rayshen/TestingU

  • 相关阅读:
    java中VO、PO、DTO 、DO、POJO、BO、TO
    java可变参数
    排序
    快速排序
    单元测试概述
    Spring 对事务管理的支持
    Spring的事务管理基础知识
    混合切面类型
    基于Schema配置切面
    Spring AOP @AspectJ进阶
  • 原文地址:https://www.cnblogs.com/rayshen/p/5145861.html
Copyright © 2011-2022 走看看