Tag: 可可

快速状态栏图标菜单

我之所以写本教程,是因为我的应用程序Blinkk(http://ralcr.com/blinkk/)需要一个,并且在网上搜索了一个教程,这很自然,但是一切看起来都很复杂,无法进行任何工作。 所以复制/粘贴解决方案是不可能的,我决定了解它是如何以编程方式工作的,最终变得非常简单。 我对插座和Xib没问题,但是为简单菜单而需要连接它们的方式使我感到紧张,我没有耐心去学习比UI元素或动作更重要的东西。 因此,这就是您所需要的,可以将其放置在applicationDidFinishLaunching中 我遇到的问题: 应该强烈引用item var,否则您将看到图标从状态栏中消失 启用项目将目标添加到每个NSMenuItem

指数

您可以在这里找到我最新的macOS App Development Series中的所有剧集。 每个链接将带您到嵌入视频的匹配文章。 搭建舞台 第1集。 故事板(2018年1月7日) 第2集。 自动版面配置(2018年1月21日) 第3集。 NSCollectionView 2018 ( 2018年1月28日) 做得更好 这里有一个主题列表,我将在接下来的几集中介绍这些主题。 NSCollectionView NSTableView 菜单栏 分割视图控制器 NSButton 自动版面 NSOutlineView 拖放 核心数据 下载 文件管理器 可可豆 迦太基 迅捷软件包管理器 感谢收看! 😎 如果喜欢,请测试 5秒钟内 可以击打 👏多少次。 这是出色的 指尖测试 ,可以帮助其他人看到故事。 如果您对任何主题感兴趣,请在下面给我留言。 在此处 查找上一个系列 。

第1集。 故事板

是2018年 新年快乐! 今年的目标是什么? 上体育馆,还是在奶酪上加些奶酪切奶酪? (来自Spotify广告的一个小玩笑) 我为什么要这样做? 我今年的主要目标是付出多于付出。 过去,我回顾了我的作品,发现macOS App Development视频教程对世界产生了一些影响。 我决定再次上课,并用新内容更新教程。 这就是为什么您看到第一篇文章。 我在做什么? 我将其作为实验和附带项目,我的主要工作是构建Sorted。 如果您发现任何拼写错误,发音错误或教学方法不正确,请随时告诉我。 我会尽力提高质量。 我是为谁干的? iOS开发人员或编程初学者。 我开始通过扩展Sorted以涵盖Mac平台来制作macOS应用。 我已经看到了两组主要的macOS开发人员。 他们要么是具有10多年经验的经验丰富的开发人员,要么是他们开始在iOS上工作,并希望将产品扩展到像我这样的macOS。 该系列专为正在转向macOS开发的iOS开发人员而设计。 同时,内容对于初学者也很容易理解。 我该怎么做? 我2018年的决议是付出多于付出。 我希望通过在YouTube上发布视频和在Medium上发布文章,希望使内容可以广泛地提供给大多数人。 如果在托管方面没有什么帮助,我愿意制作中文版本并与中国开发者社区共享。 每个星期天都有新剧集 … 免费。 我正在学习整个过程。 我相信最好的学习方法就是教书。 我鼓励您将您的想法发给我,如果您喜欢这些内容,请留下评论并鼓掌。 双赢 。 我还创建了一个索引页。 现在看起来有些空白,但是每周我都会在文章和视频中添加新链接。 作为这个新系列的第一集,让我们从一些基础知识开始。 故事板是我两年前制作的上个系列中观看次数最多的视频。 这也跳过了编码语法和语言版本的复杂性。 希望您喜欢这个短片。 源代码可以在这里找到。 下周见。 请按照此处的系列获得通知。 这些天在地球北边有点冷。 保暖。 对于那些在南部的人。 希望您周末愉快! 感谢收看! 😎 如果喜欢,请测试 5秒钟内 可以击打 👏多少次。 这是出色的 […]

具有工具栏的macOS简单自定义窗口-第2部分

我希望工具栏中有一个小的图像,以指示“浅”或“暗”外观。 我将使用在第1部分中创建的项目。 步骤1.我使用Figma放下了两个图标,并对它们进行了着色,并使用@ 2x作为名称将它们保存为64×64大小。 步骤3.打开情节提要,然后将“工具栏”拖放到窗口中。 从工具栏中删除所有元素,然后添加ImageView。 步骤4.将ImageView连接到CustomWindow.swift。 如下更新代码。 如果我想以编程方式添加NSImage会怎样? 我最喜欢的开发工具之一是PaintCode。 使用此工具,我可以轻松地从.svg创建Swift(或Obj-C)代码。 第1步。让我们转到Storyboard,然后将ImageView添加到View Controller。 然后将其作为IBOutlet连接: @IBOutlet var imageView:NSImageView! 我们将再次需要两个图像用于“亮”和“暗”状态。 重复深色版本,然后保存。 最后,将其添加到Xcode中的项目中。 步骤3.到目前为止一切顺利,但是我们的应用程序将如何得知外观变化? 幸运的是,有一种简单的KVO方法。 如下更新我们的ViewController: 资料来源: Mohammad Asgharneya:涂成黑色:macOS Mojave中的黑暗模式 您可以在此处找到源代码。

iOS:使用IBInspectable

顾名思义,本教程将指导您如何直接通过IBInspectable(InterfaceBuilderInspectable)从Interface Builder设置控件上的自定义值,我们可以创建可以在Interface Builder中检查的属性。 让我们以按钮为例,假设我们必须在按钮上设置拐角半径或边框宽度或颜色。 创建UIButton的子类,并使用IBInspectable添加以下属性,并实现其setter和getter 现在选择“属性”检查器。 您将看到自定义属性出现。 您可以设置所需的值而无需编写任何代码。

探索NSTextField

最近,我正在一个简单的待办事项列表应用程序中玩NSTextField。 我想在每个待办事项中包含一个可编辑的文本字符串。 我写这篇文章是为了谈论我一直在申请的东西。 建立项目 这是一个待办事项列表,我将使用NSCollectionView构建基本的UI。 该布局是一个简单的基于行的垂直布局。 我可以使用NSCollectionViewFlowLayout轻松实现这一点。 显示待办事项 由于我要显示的待办事项内容非常简单,因此我选择一个NSTextField作为容器。 我还将默认textField变量链接到放置在该项目中的NSTextField组件。 现在,我可以通过设置“ textField?.stringValue ”轻松显示待办事项。 NSTextFieldDelegate中的回调 该协议实际上是NSControlTextEditingDelegate的扩展,其中提供了一些基于NSControl的委托方法,这些方法仅适用于文本编辑功能。 默认协议方法提供了在编辑文本内容之前和之后的挂钩。 通过编辑,这意味着在更改内容时在键盘上键入。 实际上,我想在单击该项目时收到通知。 然后,我可以修改内容,然后按“ Return ”以保存更改。 子类化NSTextField 为了通过单击该项目获得通知,我将在NSTextField中重写成为firstFirstResponder() 。 我还创建了相应的委托方法,以便可以在单击项目的基础上进行更改,例如显示插入符号或将应用程序更改为编辑模式等。 拦截返回键 这是通过实现有关命令选择器的委托方法来完成的。 每个键盘命令键都会生成此方法的回调。 通过比较当前的命令选择器,当按下“ Return ”键时,我会收到通知,命令选择器为“ insertNewline(_ 🙂 ”。 然后,我可以保存待办事项,然后更改回查看模式,等等。 摘要 NSTextField的工作逻辑与iOS的UITextField完全不同。 NSTextField委托的文档非常含糊。 在实现您的欲望逻辑之前,应该更谨慎一些,并回避这些回调。

使用拖放API构建类似Trello的iOS应用

拖放是用户交互,当我们要构建一个用户可以在屏幕上移动数据的应用程序时,它很自然地起作用。 Trello,Jira等应用程序正在大量使用它在板之间移动数据。 在iOS 11 SDK发行之前通过拖放交互构建iOS应用程序并不是一个简单的过程。 根据我以前的经验,我们必须手动执行一些繁琐的任务,例如: 将长按手势识别器添加到我们要拖动的视图中。 用户开始拖动时创建快照视图。 当用户在屏幕上拖动快照时,处理所拖动快照坐标的更新。 当用户将项目放到坐标位置时进行检测和处理。 同步放置的数据目标和拖动的数据源,然后分别更新UI。 即使完成所有这些任务,也很难使它顺利运行。 值得庆幸的是,随着iOS 11的发布,Apple终于在Cocoa Touch SDK中提供了拖放API。 自从iOS 12是移动操作系统的最新版本以来,iOS 11是iPad以来最大的OS更新,这是史蒂夫·乔布斯(Steve Jobs)在2010年1月首次推出该设备以来,它是第三台介于PC和智能手机之间的设备。 它支持多任务处理,其中多个应用程序同时在“分屏”和“滑行”界面上运行。 macOS的Dock也是首次引入,它允许用户自定义自己喜欢的应用程序和最近使用的应用程序。 拖放API是在应用之间进行通信的最佳方式。 以下是几个主要功能: 在iOS上支持系统范围的拖放。 使用拆分视图或拖动到Dock上的应用程序图标,可在应用程序之间移动文本,图像和文件。 拖放视图时,API会自动处理所有动画。 开发人员只需要实现协议即可获得更大的灵活性和定制性。 支持通过拖动一个项目并点击其他项目来拖动多个项目。 拖放式API 根据Apple文档页面,以下是拖放API概述的简要摘要: 拖放功能既可以在单个应用程序中运行,也可以在多个应用程序之间运行。 在iPhone环境中,拖放操作仅在单个应用程序中有效。 在多应用程序环境中,用户开始拖动视图的应用程序将成为源应用程序。 目标应用是用户将视图放置到的应用。 当用户正在执行拖放手势时,系统会启动“ Drag Activity 。 系统还管理用户通过Drag Session拖动的对象的状态。 可以将UIView配置为使用实现UIDragDelegate和UIDropDelegate对象来支持拖放。 UITableView和UICollectionView都具有其自己单独的视图属性和协议,以处理单元格之间的拖放。 该API提供了自定义拖放行为的灵活性。 该系统还使用UTI (Uniform Type Identifier)安全,自动地处理应用程序之间的数据移动和加载,以处理文本,图像,联系人和其他许多内容。 我们将建立什么 在本教程中,我们将使用拖放API构建具有以下基本功能的类似Trello的应用程序: 创建一个木板。 将项目添加到板上。 使用拖放在木板之间移动项目。 为了成功创建这些功能,以下是我们将在项目中实现的任务: 应用流程图。 […]

在iOS应用中设置导航栏的样式

因此,您已经开始开发Wee应用程序,甚至是大型应用程序,并且想要实现以下目标: 它看起来非常简单:状态栏为白色,状态栏下方为深红色,导航栏具有相似但略有不同的颜色。 只是开个玩笑,这些颜色就以“ breakapp”的速度摆在一起供您使用。 关键是要弄清楚如何在iOS中执行操作非常棘手,除非您知道从哪里看。 有时,您感觉就像是您在掌握Google搜索,而不是如何编码才能找到这些东西。 但是,请不要害怕,亲爱的朋友们,请继续阅读,我将向您展示导航栏向导的方法。 我们需要做的第一件事是导航到应用程序的AppDelegate。 当您在此处设置样式时,它们将在整个应用程序范围内。 首先,让状态栏样式(顶部为白色文本和电池信息等)点亮内容。 func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->布尔{ application.statusBarStyle = .lightContent } 在didFinishLaunchingWithOptions函数内部,只需输入上面的代码。 生成并运行。 等待它不起作用。 事实证明,您还需要通过转到info.plist并添加新键来确认此选项:“查看基于控制器的状态栏外观”并将其设置为“ NO”。 如果您只输入’V’,它实际上会首先出现在列表中,这样您就不必记住它了-如果您真的想记住它,请使用一个助记符,例如:’不应允许弯曲的瓶子’(VCBSBA)…无论如何 繁荣! 您的应用现在具有很好的轻量级内容。 但是,我们如何增强NavigationBar的功能,使其充满色彩呢? UINavigationBar.appearance()。barTintColor = UIColor(红色:230/255,绿色:20/255,蓝色:20/255,alpha:1) 原来,您只使用barTintColor,它非常简单。 顺便说一句,您可能要删除NavigationBar底部的细微阴影。 如果是这样,请执行以下操作: UINavigationBar.appearance()。shadowImage = UIImage() 尽管看起来有些古怪,但这可以有效地消除阴影。 香蕉警报 是。 让我们这样做。 让我们首先在闭包中定义一个漂亮的小视图。 这包含我们需要的所有属性,并将其装箱返回。 好极了! 让navigationBackgroundBar:UIView = {让视图= UIView()view.backgroundColor = UIColor(红色:220/255,绿色:10/255,蓝色:10/255,alpha:1)view.translatesAutoresizingMaskIntoConstraints = falsereturn view}() 在上面,您只是在创建一个视图,设置它的背景色,停止自动翻译出现在手动视图中的约束(它只是在提供帮助,但我们不需要),然后返回该视图。 差不多好了。 window?.addSubview(navigationBackgroundBar) […]

Swift 1中的核心数据:创建纯Swift NSFetchedResultsControllerDelegate

在Swift中使用Core Data的路径不像高速公路,而更像是一条依山傍水的危险小径。 但是,像许多Swift问题一样,问题不是新的危险,而是现有的不安全做法正在被揭示。 一种方法是简单地重新创建不安全的做法,例如使用隐式展开的可选方法。 另一种方法是将所有内容包装在“ guard”和“ if let”的多个级别中,以使控制流隐藏在不必要的分支中。 无论如何,Objective-C的假设在框架中构建得越深,在与众不同的Swift世界中就越难使用。 即使系统已试图弥合差距,例如将具有混合结果的Objective-C泛型添加到NSFetchedResultsController中,这也是正确的。 编译器崩溃后,需要另一种方法。 与许多Cocoa委托一样,在Swift中使用NSFetchedResultsController的可能性受到它所施加的要求的限制:委托必须是NSObject,其方法必须是Objective-C,并且回调不能是通用的。 目标是使NSFetchedResultsControllerDelegate适应隐藏其旧的Objective-C包。 这可以通过将NSFetchedResultsController包装在一个适配器类中来完成,该适配器类确实满足旧的要求,并在纯Swift中传递新的委托回调。 第一步是将委托重新创建为Swift协议: 这里的接口几乎与NSFetchedResultsControllerDelegate完全匹配(省去了无关的controller(_:sectionIndexTitleForSectionName) )。 该关联类型被命名为ResultType,并且由于它将是NSFetchedResultsController的ResultType,因此具有NSFetchRequestResult约束,但是我们并没有通过要求编译器将Objective-C桥接到Swift泛型而混淆了编译器。 注意,我们仍然使用NSFetchedResultsController:我们还没有准备好重构它。 现在的目标是适应代表。 因此,我们保留NSFetchedResultsController及其相关的“ NSFetchedRequestResult”和“ NSFetchedResultsChangeType”。 然后可以构建适配器: 即使不对泛型进行解码,也很难避免发生的事情:来自NSFetchedResultsController的委托消息被转换并传递给FetchedResultsControllerDelegate实例。 每个细节都需要考虑,但是要逐行考虑: 类声明和属性 像大多数泛型一样,类的声明可能不是直觉的。 大致可以分为三个部分: 1) class FetchedResultsControllerAdapter FetchedResultsControllerAdapter具有单个通用类型Delegate,它是我们之前创建的FetchedResultsControllerAdapterDelegate的实例。 AdapterDelegate在类型上必须是通用的,因为正如大多数Swift开发人员所了解的那样,由于它具有Self或关联的类型要求,因此只能用作通用约束。 在整个课程中,我们将其称为“委托”。 由于Delegate具有ResultType,因此我们也可以引用它,例如在Fetched Results Controller属性中: private(set) var fetchedRequestController : NSFetchedResultsController 这是确保NSFetchedResultsController和Delegate的ResultType匹配所必需的。 2) NSObject, NSFetchedResultsControllerDelegate FetchedResultsControllerAdapter是一个NSObject,它符合NSFetchedResultsControllerDelegate的要求。 3) where Delegate: AnyObject 对于内存管理存在此约束。 代表是保留周期的经典来源。 如果此对象强烈引用其委托,使其保持活动状态,并且如果该委托强烈引用该适配器(几乎可以肯定),则使其保持活动状态,则将永远不会释放这两个对象。 […]

如何在Xcode中使用Nibs和Coordinators代替Storyboard

Xcode中的情节提要板起初很方便,但是随着应用程序的增长,需要维护或您与团队一起工作,它们会带来很多伤害。 本文根据我的经验提供了有关如何使用nib文件构建应用程序的指导。 故事板有什么问题 与桌面应用程序相比,移动应用程序的导航功能繁重,在可视化编辑器中帮助开发人员进行设计和导航体验非常有意义。 苹果公司在2010年用Xcode 4引入了它们,并使它们成为在nib文件上创建可视用户界面的默认设置。 不幸的是,Xcode故事板存在很多问题: 添加的屏幕越多,对其进行编辑就越麻烦。 您必须不断滚动和缩放很多才能找到要编辑的屏幕 而且,如果您将情节提要板分开,那么记住每个视图控制器放在哪个情节提要板上并非易事 他们很慢。 每次打开情节提要时,它都会显示一个微调框,而Xcode经常会忘记您的上一个滚动位置 如果您在团队中工作,则不可能避免合并冲突,并且合并情节提要xml并不像合并代码那样容易 如果您的屏幕根据应用程序的状态显示不同的视图,则必须使用遏制序列,这意味着创建许多子视图控制器类,或者在彼此之上堆叠视图,这使得编辑很麻烦,因为它们在Xcode中彼此隐藏 通常情况下,导航是非常繁琐的,无法使用情节提要脚本来创建,最终您只能通过代码来完成。 然后,您将混合使用程序化和情节提要导航,这令人迷惑且令人困惑 创建和使用nib文件 自从放弃故事板以支持笔尖以来,我的开发人员的生活变得如此轻松。 幸运的是,Xcode仍然允许您使用关联的笔尖创建视图控制器子类: 这为您项目中的每个View Controller提供了两个文件,彼此相邻,并且始终易于访问: 然后可以使用默认的初始化程序实例化它(不需要标识符字符串!): 让viewController = ViewController() 应用程序启动后,您需要将根视图控制器分配给一个窗口,并告诉应用程序显示该窗口: 让窗口= UIWindow(框架:UIScreen.main.bounds) window.rootViewController = viewConroller window.makeKeyAndVisible() (如果我们像Xcode的项目模板那样在Info.plist中指定主故事板,这就是Xcode / iOS为我们方便地做的事情) 通常,您希望将根视图控制器包装在导航控制器中,以便可以推送其他视图控制器: 让navigationContoller = UINavigationController(rootViewController:viewController) window.rootViewController = navigationController 输入协调员课程 从结构上讲,笔尖非常适合协调器 (也称为流量控制器 ,请在此处观看Soroush Khanlou的精彩介绍演讲)。 其背后的想法非常简单:创建类,其唯一职责是通过管理视图控制器来控制应用程序的导航流程,从而使情节提要过时。 并且每当您在视图控制器中使用UINavigationController.pushViewController(_:animated 🙂或UIViewController.present(_:animated :)等时 ,都可以调用协调器。 协调器不仅使我们能够减少视图控制器中的代码行,而且这种模式的真正优势在于减少了视图控制器之间的依赖关系:通过segue关联的两个视图控制器不需要彼此了解再也不用了,如果我们使用依赖反转,他们甚至不需要了解协调器(即让他们通过协议与协调器进行对话)。 这对我们的体系结构来说非常好,因为它意味着更低的耦合和更好的可重用性。 补充意见 […]