国内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

MACOS 答题器,界面跳转的更多相关文章

  1. 一个基于chrome扩展的自动答题器

    1.写在前面 首先感谢小茗同学的文章-[干货]Chrome插件(扩展)开发全攻略, 基于这篇入门教程和demo,我才能写出这款 基于chrome扩展的自动答题器. git地址: https://git ...

  2. iOS界面跳转的一些优化方案

    原文地址: http://blog.startry.com/2016/02/14/Think-Of-UIViewController-Switch/ iOS界面跳转的一些优化方案 App应用程序开发, ...

  3. Android 手机卫士--设置界面&功能列表界面跳转逻辑处理

    在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...

  4. iOS 简单音乐播放器 界面搭建

    如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间 ...

  5. Android activity界面跳转动画

    实现activity界面跳转动画 1.在startActivity方法之后加入: overridePendingTransition(R.anim.pull_in_right, R.anim.pull ...

  6. 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter

    PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以rout ...

  7. ios中的界面跳转方式

    ios中,两种界面跳转方式 1.NavgationController本身可以作为普通ViewController的容器,它有装Controller的栈,所以可以push和pop它们,实现你所说的跳转 ...

  8. PyQt5实现界面跳转

    网上关于PyQt5的教程很少,特别是界面跳转这一块儿,自己研究了半天,下来和大家分享一下 一.首先是主界面 1 # -*- coding: utf-8 -*- # Form implementatio ...

  9. Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。

    当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID:  大概就是点击H5界面跳转到Androi ...

随机推荐

  1. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25

    T21 二维数组右上左下遍历 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组. 输入 输入的第一行上有两个整数,依次为 ...

  2. 64位centos 下编译 hadoop 2.6.0 源码

    64位os下为啥要编译hadoop就不解释了,百度一下就能知道原因,下面是步骤: 前提:编译源码所在的机器,必须能上网,否则建议不要尝试了 一. 下载必要的组件 a) 下载hadoop源码 (当前最新 ...

  3. 2015-2016-2 《Java程序设计》教学进程

    2015-2016-2 <Java程序设计>教学进程 目录 考核方式 寒假准备 教学进程 第00周学习任务和要求 第01周学习任务和要求 第02周学习任务和要求 第03周学习任务和要求 第 ...

  4. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  5. sFlow

    http://www.sflow.org/developers/specifications.php http://www.inmon.com/technology/index.php sFlow s ...

  6. 解决服务器上 w3wp.exe 和 sqlservr.exe 的内存占用率居高不下的方案

    SQL Server是如何使用内存 最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉.所以一般我们在看sta ...

  7. The Lifecycle and Cascade of WeChat Social Messaging Groups-www2016-20160512

    分析性论文: 分析并预测微信群的生命周期,以及群成员的邀请模式. 参考资料:http://www.360doc.com/content/16/0423/11/26166517_553076725.sh ...

  8. JAVA多线程(一)

    进程与线程: 一个进程可以包含多个线程.多个线程可以并行,但是一个时间点只能有一个线程是运行状态. 线程的状态: 查看API可以,线程的状态分为五种: (JVM里面的状态:These states a ...

  9. hdu2642二维树状数组单点更新+区间查询

    http://acm.hdu.edu.cn/showproblem.php?pid=2642 题目大意:一个星空,二维的.上面有1000*1000的格点,每个格点上有星星在闪烁.一开始时星星全部暗淡着 ...

  10. UEFI与MBR区别

     EFI与MBR启动的区别 大硬盘和WIN8系统,让我们从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的主流电脑,都是预装WIN8系统,为了更好的支持2TB硬盘 ,更快速的启动win ...