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
MACOS 答题器,界面跳转的更多相关文章
- 一个基于chrome扩展的自动答题器
1.写在前面 首先感谢小茗同学的文章-[干货]Chrome插件(扩展)开发全攻略, 基于这篇入门教程和demo,我才能写出这款 基于chrome扩展的自动答题器. git地址: https://git ...
- iOS界面跳转的一些优化方案
原文地址: http://blog.startry.com/2016/02/14/Think-Of-UIViewController-Switch/ iOS界面跳转的一些优化方案 App应用程序开发, ...
- Android 手机卫士--设置界面&功能列表界面跳转逻辑处理
在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...
- iOS 简单音乐播放器 界面搭建
如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间 ...
- Android activity界面跳转动画
实现activity界面跳转动画 1.在startActivity方法之后加入: overridePendingTransition(R.anim.pull_in_right, R.anim.pull ...
- 如何优雅的实现界面跳转 之 统跳协议 - DarwinNativeRouter
PS 感谢大家的关注,由于我本想开源4个库,除了router, 另外三个分别是native dispatcher, web dispatcher 和 react dispatcher , 所以rout ...
- ios中的界面跳转方式
ios中,两种界面跳转方式 1.NavgationController本身可以作为普通ViewController的容器,它有装Controller的栈,所以可以push和pop它们,实现你所说的跳转 ...
- PyQt5实现界面跳转
网上关于PyQt5的教程很少,特别是界面跳转这一块儿,自己研究了半天,下来和大家分享一下 一.首先是主界面 1 # -*- coding: utf-8 -*- # Form implementatio ...
- Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。
当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID: 大概就是点击H5界面跳转到Androi ...
随机推荐
- Autofac中的属性注入功能使用
使用依赖注入容器时,大部分都是使用构造函数来注入或者是xml配置文件.也有很多支持属性注入.Autofac就是其中一个. 1 为什么要有属性注入? 对于一些使用特频繁的类或者方法,很多类都会用到,那么 ...
- AsyncTask源码解析
package com.example.demo.activity.net; import java.util.ArrayDeque; import java.util.concurrent.Bloc ...
- 工作随笔——Intellij_idea-14官方快捷键中文版
听说Intellij Idea好几年了.因为快捷键的原因,所以一直没有放弃eclipse.上周末抽了点时间,用google翻译+自己实践翻译了一下官方的快捷键. 基本做完的时候在百度文库上突然搜索到一 ...
- 提高Visual Studio开发性能的几款插件
通过打开Visual Studio,单机TOOLS—Extensions and Updates-Online-Visual Studio Gallery(工具-扩展和更新-联网-Visual Stu ...
- 根本没有“JSON“对象这回事(读汤姆大叔博文记录)
1.字面量 (1)他们是固定的值,不是变量,让你从“字面上”理解脚本. (2)字符串字面量是由双引号("")或单引号('')包围起来的零个或多个字符串组成的. (3)对象字面量是由 ...
- 【jQuery EasyUI系列】 创建展开行明细编辑表单的CRUD应用
当切换数据网络格局(datagrid view)到detailview,用户可以展开一行来显示一些行的明细在行下面,这个功能允许您为防止在明细行面板中的编辑表单提供一些合适的布局. 步骤1.在HTML ...
- Hadoop配置安装手册
本次Hadoop集群安装一共使用四个节点,各节点IP如下: Master 172.22.120.191 Slave1 172.22.120.192 Slave2 172.22.120.193 Slav ...
- 0929mysql前缀索引如何找到合适的位数
前缀索引,是指对于VARCHAR/TEXT/BLOB类型的字段建立索引时一般都会选择前N个字符作为索引.索引很长的字符列,会让索引变得大且慢.索引开始的部分字符,这样可以大大节约索引空间,从而提高索引 ...
- JS iframe元素和父页面元素互访
说明:以下内容来自互联网 [1]子页面取得父页面的dom对象 parent.window.$('#id').val(""); [2]父页面取得子页面的对象 $(wind ...
- Mybatis学习--spring和Mybatis整合
简介 在前面写测试代码的时候,不管是基于原始dao还是Mapper接口开发都有许多的重复代码,将spring和mybatis整合可以减少这个重复代码,通过spring的模板方法模式,将这些重复的代码进 ...