首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

macOS AppKit 的事件响应简介

实例对象有三个组件:事件消息(鼠标,键盘,触控板等产生的),动作消息(action message: 比如NSButton 执行target 的action 方法,就属于一种action消息),和响应链条...,告知其已经添加了一个事件到队列中待处理. 5.macOS的窗口服务收到驱动程序的消息后,会寻找对应的进程(也就是应用程序). 6.当窗口服务找到App 进程后,会将事件派发到这个应用进程的runloop...7.当应用进程的runloop接收到事件后,就开始了事件响应机制,从此刻后,将事件将遵循NSResponder类的处理....鼠标(或触控板)事件派发路径 前面已经提到过,一个NSWindow对象使用sendEvent:方法将鼠标事件派发给用户操作的视图(NSView)对象.那么NSWindow是怎样识别是哪个NSView在被用户操作呢...当用户在一个视图控件上点击鼠标按钮后,如果包含这个视图的NSWindow不是key Window,那么这个NSWindow将会变成key Window,并且丢弃本次的鼠标事件;也就是说如果你用鼠标点击了一个不是

2.7K60

【iOS】获取当前 NSViewController 的 window 以及其所在 NSWindowController 的 window

# 前言 场景:登录成功后,我们需要关闭当前登录页的 NSViewController 以及 NSWindowController ,这时就需要获得当前的 window 进行关闭 # 解决 这里分别针对...NSView 的后面就能猜到了 self.window 通过阅读官方文档我们发现,NSView 本身就是持有 window 的,所以这个很简单 # NSViewController NSViewController...本身虽然不持有,但是我们可以这样 self.view.window # NSWindowController NSWindowController 本身也持有,所以也很简单啦 self.window...这里要注意:由于 window 是在 NSWindowController 上,而 NSView 和 NSVC 又都是在 NSWindow 上 所以这三个上获得的 NSWindow 是同一个 NSWIndow

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    OC学习7——类别、扩展和协议

    OC都是NSObject类的子类,因此,所有的类都有description方法。...3、OC中没有像Java和C++那样提供抽象类的语法支持,而在实际项目开发中,总有需要用到抽象类的时候,此时就会选择定义一个父类,并以该父类派生出多个子类,其他程序使用这些类时,实际上返回的是子类的实例...@end 类别名的命名很随意,我们自己取定就可以,一般用于描述增加部分的功能 通过类别为制定的类添加新方法之后,这个新方法不仅会影响到该类,还会影响到该类的所有子类,每个子类都会获得类别扩展的方法。...如果将一个较大的类进行分模块设计,使用类别是一个不错的选择。例如NSWindow类就采用这种设计思想,具体可以在xcode上查看NSWindow.h文件。...协议中的方法既可以是类方法,也可以是实例方法。

    70360

    【iOS】获取当前 NSViewController 的 window 以及其所在 NSWindowController 的 window

    前言 场景:登录成功后,我们需要关闭当前登录页的 NSViewController 以及 NSWindowController ,这时就需要获得当前的 window 进行关闭 解决 这里分别针对...NSView 的后面就能猜到了 self.window 通过阅读官方文档我们发现,NSView 本身就是持有 window 的,所以这个很简单 NSViewController NSViewController...本身虽然不持有,但是我们可以这样 self.view.window NSWindowController NSWindowController 本身也持有,所以也很简单啦 self.window 这里要注意...:由于 window 是在 NSWindowController 上,而 NSView 和 NSVC 又都是在 NSWindow 上 所以这三个上获得的 NSWindow 是同一个 NSWIndow

    62130

    手把手教你实现HazeOver

    让遮罩窗口位于最前方窗口后面一番搜索查找,在 NSWindow 的官方文档上找到了答案,NSWindow 实例上有一个 order(_:relativeTo:) 的方法,可以指定这个窗口实例放在某个弹窗的上面或下面...如此终于就能调用 NSWindow.order(:relativeTo:) 的方法了,如此,第一个问题也就有了技术方案。2....分析后发现,闪屏问题出现的原因,主要是因为 MaskWindow 是覆盖整个屏幕的,所以把过渡效果应用到整个窗口时,就会出现整个屏幕由黑变亮,再由亮变黑,最终导致了闪屏问题。...经过考虑和实测后发现,当最前方窗口变化时,新的最前方窗口其实从黑变亮这一过程是不太需要过渡的,过渡反而会很奇怪。所以现在需求就更明确了一些,当最前方窗口变化时,期望旧的窗口的亮度能缓慢从亮变黑。...,两个 MaskWindow 叠加后的效果是一致的。

    28330

    Java及JVM是如何识别重载、重写方法的?

    然而,Java编译器直接将我的方法调用识别为调用第二个方法,这究竟是为什么呢? Java虚拟机是怎么识别目标方法的? 重载与重写 同一类中出现多个: 名字相同 参数类型相同 的方法,则无法编译。...这些方法之间的关系称为重载。 这限制可通过字节码工具绕开,编译完成后,可再向class文件中添加方法名和参数类型相同,而返回类型不同的方法。...,因为某类中的重载方法可能被它的子类重写,因此JVM 会将所有对非私有实例方法的调用编译为需要动态绑定的类型。...:调用私有实例方法、构造器及使用super关键字调用父类的实例方法或构造器,和所实现接口的默认方法 invokevirtual:用于调用非私有实例方法 invokeinterface:用于调用接口方法...该调用会被编译为invokestatic指令 如客户不是VIP,则通过super调用父类的“折后价格”方法。

    1.2K51

    Java 虚拟机-JVM是如何执行方法调用的?(上)

    然而,Java 编译器直接将我的方法调用识别为调用第二个方法,这究竟是为什么呢? 带着这个问题,我们来看一看 Java 虚拟机是怎么识别目标方法的。...当前版本的 Java 编译器会直接选取第一个方法名以及参 数类型匹配的方法。并且,它会根据所选取方法的返回类型来决定可不可以通过编译,以及需不需要进行值转换等。 重载的方法在编译过程中即可完成识别。...这是因为某个类中的重载方法可能被它的子类所重写,因此 Java 编译器会将所有对非私有实例方法的调用编译为需要动态绑定的类型。...invokespecial:用于调用私有实例方法、构造器,以及使用 super 关键字调用父类的实例方法或构造器,和所实现接口的默认方法。 invokevirtual:用于调用非私有实例方法。...该调用会被编译为 invokestatic 指令。如果客户不是 VIP,那么我们会通过 super 关键字调用父类的“折后价格”方法。该调用会被编译为 invokespecial 指令。

    1.5K71

    JAVA基础 | java基础4(JAVA继承、JAVA多态、抽象类、接口)

    3.多态体现为父类引用变量可以指向子类对象。 4.前提条件:必须有子父类关系。 注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。...Zi,所以调用的是重写后的方法。...静态多态性:在编译时,就可以被系统识别,也称为编译时多态、静态联编、静绑定。 方法重载(overload)采用的是静态联编的方法实现。...动态多态性:在编译时不能被系统识别,而是在运行时才能被系统识别,也称为运行时多态,也称动态联编,也称动绑定。 方法覆盖(override)[也叫方法重写]、抽象方法和接口采用动态联编的方法实现。...final static修饰的变量和public abstract修饰的方法 接口和抽象类的区别: 1、抽象类和接口都不能直接实例化,如果要实例化,只能通过子类进行实例化。

    1.2K41

    Java 小白成长记 · 第 6 篇「为什么说要慎用继承,优先使用组合」

    所谓减少冗余代码,通俗来说就是实现一段代码多处使用,「在不污染源代码的前提下使用现存代码」,也就是代码「复用」,避免重复编写。...方法覆盖 / 重写 子类继承父类后,不仅可以直接调用父类的方法,还可以对父类的方法进行重写,使其拥有自己的特征。...,JVM 能够自动的识别方法覆盖。...第二个使用继承的缺点即父类更新后可能会导致一些不可知的错误,这点很好理解: 1)父类更改了方法的签名,会导致编译错误 2)父类新增了方法,并且正好和子类的某个方法同名但是返回类型不同,会导致编译错误 3...)父类新增了方法,并且正好和子类的某个方法的签名完全相同,这时候编译器会认为子类进行了方法重写,会导致编译错误 4)......

    98720

    Java虚拟机类加载机制浅谈

    Java语言是一种编译后再经过解释器执行的过程, 解释器主要就是如何处理解释Class文件的二进制字节流。JVM主要包含三大核心部分:运行时数据区,类加载器和执行引擎。        ...注意:通过子类引用父类静态字段,只会初始化父类不会初始化子类;通过数组定义来引用类,也不会触发该类的初始化;常量在编译阶段会存入调用类的常量池中,本质上没有直接引用到定义常量的类,因此也不会触发定义常量的类的初始化...3 准备 仅仅为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值即零值,这里不包含用final修饰的static,因为final在编译的时候就会分配了,同时这里也不会为实例变量分配初始化...方法是由编译器收集类中所有类变量的赋值动作和静态语句块的语句生成的,类构造器方法与实例构造器方法不同,这里面不用显示的调用父类的方法,父类的的路径中的,并且可以被虚拟机识别(仅仅按照文件名识别的)的类库到虚拟机内存中。

    77460

    【读码JDK】-java.lang包介绍

    当应用程序尝试按名称访问枚举常量并且枚举类型不包含具有指定名称的常量时抛出 Error Error是Throwable的一个子类,表示严重的错误,不应该捕获 Exception Throwable的子类...通常,编译器会捕获此错误; 如果类的定义不兼容地更改,则此错误只能在运行时发生 IllegalAccessException 当应用程序尝试反射创建实例(数组除外),当前正在执行的方法无法访问指定类的字段...通常,编译器会捕获此错误; 如果类的定义不兼容地更改,则此错误只能在运行时发生。...通常,编译器会捕获此错误; 如果类的定义不兼容地更改,则此错误只能在运行时发生。...Thread 线程是程序中执行的线程,创建线程的方法:继承Thread创建子类;实现Runnable接口;使用Callable和Future创建线程 ThreadDeath 错误异常,只有在线程终止后必须清理的情况下

    1.6K20

    HeadFirstJava

    实例变量永远都会有默认值,如果你没有明确的赋值给实例变量,或者没有调用setter,实例变量还是会有值的。...且编译器无法将此对象识别为Object以外的事物。...1)如果新的类无法对其他的类通过 IS – A 测试时,就设计不继承其他类的类; 2)只有在需要某类的特殊化版本时,以覆盖或增加新的方法来继承现有的类 3)当你需要定义一群子类的模板,又不想让程序员初始化此模板时...如果父类实现序列化,则子类也就自动实现 3)当对象被序列化时,整个对象版图都会被序列化,这代表它的实例变量所引用的对象也会被序列化 4)除非该实例变量被标记为transient,否则,该变量在还原的时候会被赋予...> 在方法参数中使用万用字符时,编译器会阻止任何可能破坏引用参数所指集合的行为。你能调用list中任何元素的方法,但是不能加入元素。

    20920

    Java学习笔记【持续更新】

    ,因为父类的初始化动作要先完成 通过super初始化父类内容时,子类的成员变量并未显示初始化,等父类super()初始化完毕后,才进行子类的成员变量显示初始化 一个对象实例化过程: Person p=new...因为调用抽象方法没意义 3.抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,这个子类还是抽象类 1.抽象类有构造函数嘛? 有,用于给子类对象进行初始化。...是的,因为需要子类覆盖其方法后才可以对子类实例化 当抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口interface 定义接口使用的关键字不是class,而是interface...,类与接口之间是实现关系 接口不可以实例化,只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化,否则这个子类就是抽象类 一个类在继承另一个类的同时,还可以实现多个接口 接口的出现避免了单继承的局限性...RuntimeExpection和其子类这种问题的发生,无法让功能继续,运算无法进行, 更多的是因为调用者的原因导致的而或者引发了内部状态的改变而导致的,那么这种问题一般不处理,直接编译通过,在运行时,

    1.3K50

    C++ —— 关于继承(inheritance)

    这⾥基类如果是多态类型,可以使⽤RTTI(Run-Time-Type-Information)的dynamic_cast)来进⾏识别后进⾏安全转换 3....派⽣类的默认成员函数 子类有6个默认成员函数,默认的意思就是指我们不写,编译器会变我们⾃动⽣成⼀个,那么在派⽣类中,这⼏个成员函数是如何⽣成的呢? 4.1 4个常见默认成员函数 1....(); cout << "~Student()" << endl; } 子类的初始化的顺序是先父后子,析构顺序是先子后父...方法一:将父类的构造函数私有化,这样子类就无法实例化对象,因为私有的成员在子类里是不可见的,但是如果不去定义的话编译器就不会报错 //方法一:将基类的构造函数私有化,这样派生类就无法实例化对象...,先继承的基类在前⾯,后⾯继承的基类在后⾯,派⽣类成员在放到最后⾯ 菱形继承:菱形继承是多继承的⼀种特殊情况。

    7710

    基础篇:深入解析JAVA泛型

    ,jvm是会把具体类型擦除的;编译生成的字节码中不包含泛型中的类型参数,即ArrayList和ArrayList都擦除成了ArrayList,也就是被擦除成"原生类型"...查看编译后的字节码文件是如何表示的: idea菜单 -> view -> show ByteCode public class MainTest { T param; public...被具体参数化的泛型才能被编译器识别为ParameterizedType类型,有三种方式获取ParameterizedType类型 // 1 子类继承泛型时,指定具体参数(可以是String等已知类型,也可以是子类的泛型参数...extends Number的子类>,表明List里的元素都是Number的子类 public static void print(List<?...---- 欢迎指正文中错误 关注公众号,一起交流,微信搜一搜: 潜行前行 泛型就这么简单 Java程序员必备基础:泛型解析 Java 获取泛型的类型实例详解

    1.4K20

    C++中类,对象,封装,继承(派生),多态

    ,对象具备的属性都是静态属性,比如我是男的,身高168,可以说话等等,接着识别这个对象的动态行为,如睡觉,看书,写博文。...当识别出这个对象的属性和行为后,这个对象就被定义完成了,然后可以根据再根据我,了解其他人,可以将这些人特有的属性和行为封装起来来描述人,由此可见,类实质上就是封装对象属性和行为的载体,而对象则是类抽出来的一个实例...其操作方式类似于数据结构中的栈。 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。...重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法。 重载的特性:方法名相同.返回类型,传入方法的参数不同(包括个数和类型)。...重载是编译时期的多态,又叫静态多态,编译时期的多态是靠重载实现的,根据参数个数,类型和顺序决定的(必须在同一个类中) 重写的特性:方法名相同,返回类型,参数均相同,必须发生在子类。

    1.1K30
    领券