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

通过Swift 2.1中的NSNotificationCenter.defaultCenter()在NSArrayController中监听项目选择的正确方法是什么

在Swift 2.1中,使用NSNotificationCenter来监听NSArrayController中的项目选择变化可以通过以下步骤实现:

基础概念

NSNotificationCenter是iOS中的一个类,它提供了一种机制来让对象之间发送和接收通知。NSArrayController是一个控制器对象,用于管理数组中的对象集合,并且可以与用户界面元素(如表格视图)绑定。

监听项目选择的步骤

  1. 注册通知监听器:在适当的初始化方法中(例如viewDidLoad),注册一个观察者来监听NSArrayController的选择变化通知。
  2. 定义通知处理方法:创建一个方法来处理接收到的通知。
  3. 移除通知监听器:在不再需要监听时(例如在deinit方法中),移除观察者以避免内存泄漏。

示例代码

代码语言:txt
复制
import Cocoa

class MyViewController: NSViewController {
    
    var arrayController: NSArrayController!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 假设arrayController已经通过Interface Builder或代码初始化
        
        // 注册通知监听器
        NSNotificationCenter.defaultCenter().addObserver(self,
                                                         selector: #selector(selectionDidChange(_:)),
                                                         name: NSSelectionDidChangeNotification,
                                                         object: arrayController)
    }
    
    deinit {
        // 移除通知监听器以避免内存泄漏
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    @objc func selectionDidChange(notification: NSNotification) {
        // 处理选择变化
        if let selectedObjects = arrayController.selectedObjects {
            print("Selected objects: \(selectedObjects)")
            // 在这里添加你的逻辑
        }
    }
}

注意事项

  • 确保在deinit方法中移除观察者,以避免潜在的内存泄漏。
  • NSSelectionDidChangeNotification是当选择的对象发生变化时发送的通知名称。
  • arrayController.selectedObjects可以获取当前选中的对象集合。

应用场景

这种方法常用于需要在用户选择数组中不同项目时执行特定操作的场景,例如更新UI、加载相关数据或执行其他业务逻辑。

可能遇到的问题及解决方法

  • 通知未被触发:确保NSArrayController的选择变化确实会发送通知,并且通知名称正确无误。
  • 内存泄漏:忘记在deinit中移除观察者可能导致内存泄漏。始终确保在不再需要监听时移除观察者。
  • 对象类型不匹配:在处理通知时,确保正确地访问和处理selectedObjects中的对象类型。

通过以上步骤和注意事项,可以在Swift 2.1中有效地使用NSNotificationCenter来监听NSArrayController中的项目选择变化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【IOS开发基础系列】UIAlertController专题

或许您可以看到带有otherButtonTitles的init方法,但是很遗憾,这个方法是没有办法通过编译的。...假定我们要让“登录”文本框中至少有3个字符才能激活“好的”按钮。很遗憾的是,在UIAlertController中并没有相应的委托方法,因此我们需要向“登录”文本框中添加一个Observer。...,我们通过在每个按钮动作的handler代码块(还有其他任何可能释放视图控制器的地方)中添加合适的代码来实现它。...(参考在viewDidLoad方法中设立observer的示例代码)。     ...3 开发技巧 3.1 常见问题 3.1.1 集成键盘监听后,重复进入页面挂机问题         在项目中,由于自定义AlertView中有用到textfield,故AlertView中添加了键盘显示隐藏的通知监听

60630

用 Swift 实现轻量的属性监听系统

前言 本文的主要目的是解决客户端开发中对“模型的一处修改,UI 要多处更新”的问题。当然,我们要知晓解决方案的细节和思考过程,以及看到其能达到的效果。我们会用到函数式编程的思想,以及伟大的“泛型”。...如果一个问题有更好的方法去解决,那为何不替换掉旧方法呢? 正文 假如你正在写的 App 是有用户系统的,也就是用户需要管理自己的信息,如修改名字、头发颜色之类的。...单独拿名字来说,除开在修改界面,可能在系统的其他界面也会使用到它,这就涉及到在更新名字后再更新其他界面的问题。 你的第一直觉是什么呢?多半是使用通知,也就是 NSNotification。...通过 push,用户可以在第 3 个界面里修改名字,这就需要更新这 3 个界面的名字,不然用户 pop 返回时就会觉得奇怪。...小结 我们面临一个“一处修改,多处更新”的问题,起初时我们用通知来实现,并无不可。之后我们想要更合理(或者更酷)一些,于是利用 Swift 的闭包特性实现了一个监听者模式。

86630
  • 【iOS开发】@objc private class func 与 Selector

    本文介绍在 Swift 中 使用 KVO 时,一些需要注意的事项,下面截取了两段我自己在项目中使用的代码。...比如,我们的界面中有一个让用户输入年龄的 UITextField,然后我们可以观察(监听),当发现用户在这里输入『0』时,我们就给一个提示:『年龄至少为1』。 简单介绍完毕,下面说注意事项。...private 关键字 最简单的使用 Selector 的情况,就是如上面所列出的,在 NSTimer 中写 selector 为 "moveText",然后我们在同一个文件中,再相应地写一个...那么你把这个动态特性再加回来就可以了~ 1.通过 @objc 关键字来使用动态特性 @objc private func moveText(){ // Your Code } 2.通过 dynamic...如果你愿意,可以写成下面这样: @objc private class func moveText(){ // Your Code } 我在 StackOverFlow 中的回答,及其它相关:

    88210

    Mac开发之 Cocoa 绑定 入门

    好了,基础概念就先介绍到这里,我们先通过一个简单的示例来具体了解绑定操作~ (1) 新建一个Cocoa应用程序,(示例开发语言使用Swift) 新建Cocoa应用 (2) 添加一个Person类,并添加一个...来构建工程,就会发现运行的效果正确,这是因为Swift中默认是关闭了KVO的属性监听,我们只需要开启就可以了,在Person类中,给score属性前面,添加一个关键字dynamic,然后再来试试运行吧...(9)设置Swift中的KVO 开启KVO (10) 通过改变score的值来影响Label和Slider 实际项目中,更常用的方式是score值变化,更新label和slider它们的显示.下面我们通过点击鼠标来修改一下...,简化了开发步骤,同时也减少了Bug的可能. 3.2 绑定到控制器 在刚刚的例子中,我们将视图直接绑定在模型对象的属性上,跳过了控制器,这种情况对应简单的使用没有问题,但绑定还有更多的使用方式,也许你在签名的例子中已经注意到了...通过cocoa 绑定,我们没有写一行代码就实现了记录用户设置的功能~ cocoa中还为我们提供了其他的控制器对象来处理应用程序中的数据访问,比如NSArrayController,可以处理一组数据集合,

    1.9K20

    设计模式(二):自己动手使用“观察者模式”实现通知机制

    通过一个小Demo对“观察者模式”进行学习后,紧接着会看一下在Swift中是如何使用Foundation框架中的通知的,并给出相应的示例。...在Boss中的registerObserver()方法用来添加监听者(为了防止重复添加,我们在添加前先进行移除),removeObserver()则是负责移除监听者,notifyObservers()是发送通知并调用观察者相应的方法...(2)、下方的的方法就是通知中心发送通知的过程了,对应着NSNotificationCenter.defaultCenter()中的postNotification(notifaction)。...(3)下方代码就是添加监听着了,与NSNotificationCenter.defaultCenter()中的addObserver()方法相对应。...上面是在Swift2.1版本中实现的代码,在Swift2.2中的Selector的参数有所变化,在此还是需要说明一下的,aSelector参数在Swift2.2中得使用#selector(类.方法),如下所示

    1.6K60

    ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

    self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) { // 这是一个假想中的 -logIn 方法,...在异步操作上使用signals信号,让通过链接和转换这些signal信号,构建更加复杂的行为成为可能.可以在一组操作完成后,来触发此操作即可: // 执行两个网络操作,并在它们都完成后在控制台打印信息..... // // 假想的 -logInUser 方法,在登录完成后,返回一个signal信号对象. // // -flattenMap: 无论任何时候,signal信号发送一个值,它的block都将被执行...signal信号对象. // // -deliverOn: 创建一个新的 signals 信号对象,以在其他队列来处理他们的任务. // 在这个示例中,这个方法被用来将任务移到后台队列,并在稍后下载完成后返回主线程中...使用独立数据的并行工作,然后最终将他们合并到一个结果中,在Cocoa中是很琐碎的,并且常常包含许多同步代码: __block NSArray *databaseObjects; __block NSArray

    1.2K91

    设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框

    设计iOS中随系统键盘弹收和内容文字长度自适应高度的文本框     文本输入框是多数与社交相关的app中不可或缺的一个控件,这些文本输入框应该具备如下的功能: 1.在键盘为弹起时,输入框悬浮在界面底部...使用autolayout布局技术加上对键盘的相关监听,可以十分方便的实现上述效果。首先在xib文件中进行相关约束的添加,如下图: ?...在初始化方法中进行通知的注册和代理的设置:     NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("...keyboardWillHidden:"), name: UIKeyboardWillHideNotification, object: nil)     ourTextField.delegate=self 实现通知的监听方法如下...UIView.animateWithDuration(time) { () -> Void in             self.view.layoutIfNeeded()         }     } 监听的键盘状态发送的通知中

    1.5K20

    成为一名优秀 Swift 开发人员的 10 个小技巧

    使用 Protocol Protocol 在 Swift 中可以做很多事情。使用协议,我们可以设计软件组件的行为,使其符合特定的实现。...此外,通过代码导航可以在导航时更好地控制共享参数和特定行为。还可以避免让 Storyboard 变得一团糟。 5. 在项目中集成最热门的第三方库 尽量不要重新发明轮子。...为项目选择正确的库是一项有意思的工作,大多数情况下,使用基本库就正确的做法。这可以让你专注于特定应用程序的特定功能,而不是在常见的功能上浪费时间。...使用扩展并合理使用它们来创建公共库 我很喜欢 Swift 扩展。在使用 Objective-C 时,我总是不情愿地使用继承。当然这并不总是错误的,正确的使用子类也不会出错。...在开发文档中,通知是在控制器与模型或服务之间实施通信可同步模式的正确方法,我在项目中经常使用 Notification Center,基本上实现了观察者模式,并让应用程序带有更多响应式的元素。

    2.3K40

    iOS 点击通知打开对应页面

    通知被点击调用的方法 设备接到apns发来的通知,应用处理通知有以下几种情况: 1)....方法中进行判断是否通过点击通知进入app,设置全局变量,在需要跳转的页面根据全局变量进行跳转 2) 应用在前台或后台 在所有可跳转的页面添加消息的观察者 override func viewWillAppear...方法中,发送消息 NSNotificationCenter.defaultCenter().postNotificationName("notificationPushView", object: nil...); 注意 添加观察者最好在viewWillAppear中添加 在viewWillDisappear中移除 否则每次接受到推送都会打开页面,当然也可以进行判断当前的页面已打开就不再打开 当然也可以不用通知去打开页面...只在应用程序启动时执行一次。application参数用来获取应用程序的状态、变量等,值得注意的是字典参数:(NSDictionary *)launchOptions,该参数存储程序启动的原因。

    2.7K20

    Swift 3.0介绍

    编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时则必须从第二个参数开始必须指定参数名等多种情况...,而在Swift3.0中不管是函数还是方法都必须从第一个参数开始必须指定参数名(当然可以使用“_”明确指出调用时省略参数)。...在之前的Swift版本中c是Int!...在Swift3.0之前如果要定义协议中可选方法,只需要给协议加上@objc之后方法使用optional修饰就可以了,但是Swift3.0中除了协议需要@objc修饰,可选方法也必须使用@objc来修饰...,也因为Swift处于初级阶段,很多类库和方法命名都尽量和ObjC保持一致,在使用Swift开发iOS应用中处处可以看到ObjC的影子。

    1.3K90

    Swift 3.0介绍

    编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时则必须从第二个参数开始必须指定参数名等多种情况...,而在Swift3.0中不管是函数还是方法都必须从第一个参数开始必须指定参数名(当然可以使用“_”明确指出调用时省略参数)。...在之前的Swift版本中c是Int!...在Swift3.0之前如果要定义协议中可选方法,只需要给协议加上@objc之后方法使用optional修饰就可以了,但是Swift3.0中除了协议需要@objc修饰,可选方法也必须使用@objc来修饰...,也因为Swift处于初级阶段,很多类库和方法命名都尽量和ObjC保持一致,在使用Swift开发iOS应用中处处可以看到ObjC的影子。

    1.3K80

    Swift 中的 asyncawait

    async-await 是在 WWDC 2021 期间的 Swift 5.5 中的结构化并发变化的一部分。Swift中的并发性意味着允许多段代码同时运行。...执行数据请求 } 在如今的Swift版本中,使用完成闭包来定义方法仍然是可行的,但它有一些缺点,async 却刚好可以解决。 你必须确保自己在每个可能的退出方法中调用完成闭包。...在一个不支持并发的函数中调用异步方法 在第一次使用 async-awai t时,你可能会遇到这样的错误。...为你的项目选择正确的 async-await 重构方法 这三个重构选项应该足以将你现有的代码转换为异步的替代品。根据你的项目规模和你的重构时间,你可能想选择一个不同的重构选项。...不再需要完成闭包,而在彼此之后调用多个异步方法的可读性也大大增强。一些新的错误类型可能会发生,通过确保异步方法是从支持并发的函数中调用的,同时不改变任何不可变的引用,这些错误将可以得到解决。

    3.5K30

    Swift 中的 asyncawait ——代码实例详解

    前言 async-await 是在 WWDC 2021 期间的 Swift 5.5 中的结构化并发变化的一部分。Swift 中的并发性意味着允许多段代码同时运行。...执行数据请求 } 在如今的 Swift 版本中,使用完成闭包来定义方法仍然是可行的,但它有一些缺点,async 却刚好可以解决。 你必须确保自己在每个可能的退出方法中调用完成闭包。...调用异步方法 在一个不支持并发的函数中调用异步方法 在第一次使用 async-await 时,你可能会遇到这样的错误。...为你的项目选择正确的 async-await 重构方法 这三个重构选项应该足以将你现有的代码转换为异步的替代品。根据你的项目规模和你的重构时间,你可能想选择一个不同的重构选项。...一些新的错误类型可能会发生,通过确保异步方法是从支持并发的函数中调用的,同时不改变任何不可变的引用,这些错误将可以得到解决。

    2.9K10

    iOS蓝牙开发如何更好地收发数据

    3月中旬跳槽了,一直在新公司「填坑」,看着「先人」写的代码,觉得是有改善空间的,所以这次想聊下这部分内容——iOS蓝牙开发中如何更好地更好地收发数据。...我们先简单回顾一下整个蓝牙数据接收的一般流程: 1、蓝牙在不断地在广播信号; 2、APP扫描; 3、发现设备(根据名称或「服务」的UUID来辨别是不是我们要连接的设备); 4、连接(成功); 5、调用方法发现...「服务」; 6、调用方法发现服务」里的「特征」; 7、发现硬件用于数据输人的「特征」,保存(APP发送数据给硬件时要用到这个「特征」); 8、发现硬件用于数据输出的「特征」,进行「监听」(硬件就是从这个..._:forCharacteristic characteristic:)监听对应的特征,才能在上述方法拿到数据。...其实这里有个坑,当单个数据的大小为2字节或以上时,我们用UInt16或UInt32去定义,会有「自动对齐」的问题,就是接到的数据,没有按指令定义的顺序对齐,导致数据不正确,这时候可以在struct后面加关键字

    2.9K32

    Swift2.1-继承继承

    在Swift中,继承是基本的,从Swift中的其他类型来区分类的一种行为。...在Swift中类可以调用和访问方法,属性和属于它们父类的下标脚本,并且提供它们自己重写的方法,属性和下标脚本来定义或修改它们的行为。...Swift会确保你的重写是正确的,通过检查,重写定义都有一个与之匹配的父类定义。 类也可以向继承的属性添加属性监听者,当属性的值改变了以便通知。...override关键词也提供Swift编译器检查,你的重写类的父类(或者父类的父类)有一个声明来匹配你提供的重写。检查确保你重写的定义是是正确的。...someMethod()在重写的方法实现中,调用父类的someMethod()方法。 一个命名为someProperty的重写属性当通过super。

    45810

    使用 Swift 创建简单的二维码扫描应用

    再拷贝 Consumer Secret,粘贴到Constants.swift 文件的 DISCOGS_SECRET 中。 同 URL 一样,现在我们可以在应用中很方便地使用这些变量了。 ?...在 viewWillAppear() 方法中,我们让 session 开始运行。相应的,在 viewWillDisappear() 方法中,让 session 停止运行。 ?...Album 模型 在专辑的数据模型 Album.swift 中,需要将专辑模型转化为我们想要的数据。...在 viewDidLoad() 方法中,设置 labels 的内容,提示用户开始扫描。我们需要添加 observer 来监听 NSNotification 从而接收通知。...同时需要在 deinit 中移除监听者。 ? 当监听到通知的时候,setLabels() 方法将会被调用。这里我们将使用 DataService.swift 中的原始字符串来初始化Album 对象。

    1.9K20

    Rust web 框架现状【2021 年 1 季度】

    在本文中,我们将讨论 web 框架是什么,并在前端和后端开发中,关于当前框架的使用,提供一些建议。 web 框架是什么?...它是为了让开发人员能够在 Rust 中创建成熟的 JavaScript 应用而精心设计的,通过在语言之间提供简单的 API 绑定,以提高速度和性能。...概述: 稳定:是 生产就绪:是 项目规模:小、中、大 Gotham Gotham 是一个灵活的 web 框架,为稳定版 Rust 构建。其是静态类型的,从而确保应用程序在编译时总是正确表达。...概述: 稳定:是 生产就绪:是 项目规模:小、中、大 Rouille Rouille 是一个微框架,它通过一个监听 socket 解析 HTTP 请求,采用线性请求和响应设计。...它们也都被 Rust 社区所接受,并且各自框架社区都提供了完善的支持库。 结语 Rust web 开发中,为前端或后端开发项目选择正确的 web 框架时,必须考虑以下几点:框架是否稳定?

    2.8K11

    是什么使代码 “Swifty”? —— Fast

    毕竟,编写高性能代码的主要部分在于测量,微调和再次测量。但是,使我们的代码在性能方面与Swift本身更加一致的一种方法是,充分利用标准库所提供的功能——特别是在处理集合(例如字符串)时。...就像我们在 Swift:字符串解析和Swift:集合切片中看过一样,Swift标准库针对性能进行了高度优化,并且使我们能够以高效的方式执行许多常见的集合操作-假设我们使用正确的API。...例如,从字符串中删除一组特定字符的一种常见方法是使用旧的ReplacementOccurences(of:with :)API,该API是Swift的String类型从其表亲Objective-C的NSString...值得庆幸的是,Swift通常不需要我们在性能代码和优雅代码之间进行选择,我们要做的就是切换到一种更合适的API,在Set中这个API仅通过我们的字符串一次即可删除其中包含的每个字符。...中关于Fast的内容 附几个简单性能优化例子: 在这篇文章也是用到了文中这个方法iOS - DeviceToken 解析来解析Token swift filter会创建全新的数组,且会对所有元素进行操作

    75710

    Kingfisher源码阅读(三)

    nil) sSelf = nil }) } }) } //调度到主线程队列,retrieveImageForKey函数本身是在主线程中的...ImageCache中还有一个删除过期缓存的方法cleanExpiredDiskCacheWithCompletionHander,我觉得也挺关键的,来看一下它的具体逻辑吧: 一些准备工作,取缓存路径,...在UIImage+Extension文件中还有一些处理图片的扩展方法,诸如标准化图片格式、GIF图片的存储、GIF图片的展示等等我也不细讲了,这些都算是一些套路上的东西,正确调用苹果给的API就好了。...里面不能添加储存属性,只能通过关联对象配合计算属性和方法的方式来hack) // MARK: - Associated Object private var lastURLKey: Void?...GIF等等) MD5摘要算法(这个我并没有仔细看) Associated Object的运用 对了,最后的最后,Swift已经开源啦!

    73240
    领券