热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一步一步,开始上手Mac开发(一)

https:www.jianshu.compfeadeb1ae7ae周末闲暇,在网上看到一篇Mac开发教程HowtoMakeaSimpleMacApponOSX10.

https://www.jianshu.com/p/feadeb1ae7ae

 

 

周末闲暇,在网上看到一篇Mac开发教程How to Make a Simple Mac App on OS X 10.7 Tutorial: Part 1/3,鉴于Mac开发资料较少,翻译整理,也算是自己练习的一个过程记录。

学习目标:

通过本文,你可以创建你的第一个Mac Application,编译并指定版本号,而且经过练习,你应该掌握:

1. 如何使用Xcode 创建Mac app

2. 一个Mac app 的基本结构

3.  Mac OSX开发与iOS开发的不同

4. 怎样使用Table Views (比如添加或者删除行)

5. 怎样使用文本(text field),按钮(button),图片(image view)

6. 图片(image view)的获取方式(从硬盘或者摄像头)

7. 窗口(window)的尺寸控制

实践开始:

创建一个Mac工程其实与iOS工程非常相似,都使用Xcode,只是选择的工程模版不同?

1.1 首先开启Xcode 创建工程

创建新Xcode 工程

1.2 选择mac OS 标签,Application栏中的Cocoa Application 然后点击next下一步

选取工程模版

1.3 配置工程信息和开发语言(本文根据英文原文,使用Objective-C 开发)

配置项目工程信息

1.4 选择保存的文件夹路径后,点击Create完成工程创建

创建后的界面

项目就绪,现在你已经拥有一个具有空窗口的Mac Application了,点击运行,Xcode将开始编译这个App,当Xcode编译完成后,你就可以看到这个App的主窗口了(尽管它上面空空如也),到这步,对你来说意味着三件事:

1. 选择模版没有出错并且它能正常工作

2. 一个好的编译开端:尽管这是一个空窗口项目

3. 与iOS开发有很多不同:Mac开发的窗口(window)不像iPhone或iPad固定屏幕尺寸,它完全可变的;Mac app 可以拥有多个窗口(window),你也可以最小化窗口(window)等操作

下面我们要使用窗口(window)来做写练习,显示一些信息,正如iOS开发一样,我们接下来创建一个View Controller,在这个view中,我们可以设置app的UI。

1.5 添加一个新的View Controller:菜单栏中 选择File/New/File...

选择文件模版

1.6 命名新添加的类命名MasterViewController 继承自父类NSViewController,并使用Xib描述UI

创建MasterViewController

1.7 选择保存路径后,点击create,完成创建

点击create 完成创建

1.8 Xcode工程添加MasterViewController后,应该类似下图

添加MasterViewController后的界面

1.9 选中MasterViewController.xib,因为我们这个工程练习需要显示一些Bugs信息列表,所以需要一个table view,在Mac中,这个控件叫做NSTableView(类似iOS中的UITableview)。可能你已经意识到了,在iOS中你熟知的许多UIKit控件,就是脱生于Mac OSX 的AppKit,只是把原来在Mac OSX中的NS前缀改为UI前缀而已,因此,多数情况下,你在iOS中经常用的控件基本上Mac上已经存在了,试着使用NS来代替UI开头查找一下,你会惊讶的发现许多控件:NSScrollView, NSLabel, NSButton 等,但要注意,这些控件的API可能在Mac环境中会与iOS原本的有很多不同。现在,拖动table view到xib面板的view中,随便放个地方就可以(在后面我们会学习处理它)

选择table view

现在你已经拥有一个view,并且它上面有个table view,但是它并不能显示出来。这是因为你并没有将MasterViewController 添加到主窗口(main window),这一步,需要在AppDelegate中进行。为了使用view Controller, 就要让App Delegate 知道它的存在,因此你需要做第一步就是在AppDelegate.m中导入view controller的头文件

1.10 在AppDelegate.m文件中,导入MasterViewController,并创建成员属性

现在Application Delegate 已经拥有了MasterViewController 属性,但是这并不能显示(被view controller管理的)视图到应用程序的屏幕上,我们还需要通过实例化这个属性来创建一个新的view,并需要将新创建出来的view 添加到应用的主窗口中才可以。那么我们在什么时刻做这些事情比较合适呢?

当应用程序(Application)启动后,操作系统会调AppDelegate的这个方法“applicationDidFinishLaunching”,在这里我们可以编写一些初始化代码,保证应用在启动后会执行(仅且一次),对应熟悉iOS开发的来说,这与iOS中的– (BOOL)application:didFinishLaunchingWithOptions:launchOptions方法作用相等。

1.11 创建view controller 并添加view到window中

添加controller的view 到window中

上面的代码做了三个操作:

1. 使用initWithNibName:方法从nib(就是我们创建控制器时的Xib)文件中创建了一个新的view Controller。

2. 将控制的view 添加到主窗口的容器视图(contentView)中。

3. 设置控制器view的大小与主窗口相等。


在OSX中,窗口(NSWindow class)总是会默创建一个view,叫做contentView,它的尺寸自动跟随窗口变化,如果想添加view到窗口中,那么要使用addSubView方法把它们加到contentView。到此,与iOS开发比较,你会发现一些不同,在iOS中需要设置窗口的根控制器(rootViewController),但在OSX中并不存在根控制器,因此需要将view添加到窗口的contentview中。

1.12 点击运行,在主窗口将会显示带有table View的视图

运行结果

上面的运行结果显示了一个空的table View,为了能够显示一些我们想看的结果,我们需要一些数据,但在创建数据模型之前,我们先来组织一下工程结构,目前我们的工程目录结构是这样的:

项目工程目录结构

Xcode默认的工程模版只会根据应用名创建组(Group)和一个子组supporting files ,当我们的工程不断变大时,必须处理大量的文件,这样查找需要的文件会变得非常困难。下面我们展示一种组织工程文件的方式:分组

首先在 ScrayBugsMac组 点击鼠标右键,在弹出菜单中选择“New Group” 创建一个名字为“GUI”的新组

将我们的一些文件(( AppDelegate.h/.m , MasterViewController.h/.m/.xib 和 MainMenu.xib)直接拖动到这个新组中

同样的方法,我们在ScrayBugsMac组中再创建一个Model组,用来放置后面需要用到的数据模型

整理后的工程目录

1.13 在工程目录中,右键点击Model组 ,选择“New file...”,然后选择macOS/Cocoa Class

选择文件模版

1.14 为文件命名为ScaryBugData,并继承自NSObject

创建ScaryBugData

1.15 在最后的窗口中,点击create,完成ScaryBugData创建,工程看起来应该像下这样:

创建ScaryBugData后的工程

1.16 为ScrayBugData编写代码,添加两个属性:title和rating 以及一个便捷初始化方法

ScrayBugsMac的.h和.m

ScrayBugData 是我们创建的第一个数据模型对象,我们用这个数据模型保存Bug的名称和标记Bug的重要程度,并为这个数据模型添加了一个自定义的初始化方法:- (instancetype)initWithTitle:(NSString *)title rating:(float)rating

strong :系统的runtime会自动保持对其进行强引用(ARC)

assign:基本数据类型(非对象类型)使用,不会触发内存管理问题(不会纳入到ARC中)

1.17 使用同样的步骤,我们再创建另一个数据模型ScaryBugsDoc,并编写代码,结果如下:

ScaryBugsDoc的.h文件和.m文件

至此,我们已经完成了数据模型的构建。这时我们最好编译运行一下项目工程,以确保我们做的这些操作都没什么问题,虽然窗口里table View仍然是空的,这是因为我们并没有把数据模型和UI连接在一起。接下来,我们为MasterViewController 添加一个数组属性,用来存储许多ScaryBugDoc类型的数据模型

1.18 在项目工程中选中MasterViewController.h文件,添加一个bugs属性

MasterViewController.h

现在MasterViewController 已经准备好接收数据,我们需要把图片资源添加到工程中(你也可以自己找些喜欢的图片也可以从来这里下载我们使用的示例图片),拖动你下载好的图片到工程时,要确保“Copy items if needed”

拖动图片到项目中时的选项界面

1.19 现在我们可以创建一些演示数据了,选择AppDelegate.m,导入ScaryBugsDoc.h,并创建演示数据:

AppDelegate.m文件

运行程序,确保上面我们做的设置没有错误。为了能够显示需要的Bug 列表,我们要让table view 从模型中获取数据。在OSX中table view 控件是NSTableView,它类似iOS中的UITableView,不同的是在NSTableView的一行(row)中可以有很多列(column)

1.20 选中table view,设置它的UI属性:只显示1列(column),去除header,每行交替色差效果

Tableview 设置 

1.21 设置table view cell:添加新的cell:Image&Text Table Cell,并设置它的高度为32。

添加新的cell,并设置高度值32

 

1.22 设置table column的重用标识(类似iOS中cell 的identify):

设置column的identity

到此,关于table view 的UI,我们都完成了,点击运行,确保设置正确,效果如下:

table view 设置后运行效果

与iOS相似,NSTableView 也有数据源和代理这两个属性,现在我们需要将MasterViewController设置为table view 的数据源和代理(通常情况下,table view的数据源和代理都是控制器),这一步可以通过代码设置,也可以在xib图形界面中设置:

设置table view 的数据源和代理属性

1.23 选中MasterViewController.m文件,编写代码:

实现table view 的数据源和代理方法

1.24 点击运行,如果设置都正确的话,你将看到一个带有图片和文字的table view:

最终运行结果

你可以从这里下载到整个项目的demo:github 代码示例



作者:代码行者
链接:https://www.jianshu.com/p/feadeb1ae7ae
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


推荐阅读
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在 `UITableViewController` 中采用简洁的平面样式布局时,可以通过优化代码实现单元格扩展至屏幕边缘的效果,同时确保节标题以分组样式呈现,从而提升用户体验和界面美观度。通过这种方式,可以更好地组织和展示列表内容,使其更加清晰和有序。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 教育类应用程序:提升学习效率的专业工具
    2019年,多家独角兽企业高薪聘请Python工程师,这引发了对高效学习工具的关注。以Duolingo为例,其“边玩边学”的模式为语言学习提供了新思路。类似地,错题本作为一种有效的学习方法,能够帮助学生记录和复习易错题目,从而提高学习效率。教育类应用程序通过整合这些先进的学习策略和技术手段,正逐渐成为提升学生学习效果的重要工具。 ... [详细]
  • 在iOS平台上,应用的流畅操作体验一直备受赞誉。然而,过去开发者往往将更多精力集中在功能实现上,而对性能优化的关注相对较少。本文深入探讨了iOS应用性能优化的关键要点与实践方法,旨在帮助开发者提升应用的响应速度、降低功耗,并改善整体用户体验。通过具体案例分析和技术解析,文章提供了实用的优化策略,包括代码层面的改进、资源管理优化以及界面渲染效率的提升等。 ... [详细]
  • 这篇文章将揭示 Vue 和 React 组件库中五个鲜为人知的强大工具。这些工具均以纯 JavaScript 实现,功能卓越。其中,async-validator 是一个数据验证插件,不仅预置了 URL 和电子邮件的验证规则,还支持异步验证功能。 ... [详细]
  • 整合百度UEditor编辑器于ASP后端的实现步骤与技巧
    随着微软停止对XP系统的支持,公司已全面升级至Windows 7。早期网站创建时使用的编辑器仅兼容IE6浏览器,而如今系统更新后,原有的编辑器已无法满足新环境的需求。本文详细介绍了如何将百度UEditor编辑器整合到ASP后端,包括实现步骤和实用技巧,确保网站在新系统下仍能高效运行并提供良好的用户体验。 ... [详细]
  • 使用 Vue 集成 iScroll 实现移动端表格横向滚动与固定列功能 ... [详细]
  • 本文详细解析了如何利用Appium与Python在真实设备上执行测试示例的方法。首先,需要开启手机的USB调试功能;其次,通过数据线将手机连接至计算机并授权USB调试权限。最后,在命令行工具中验证设备连接状态,确保一切准备就绪,以便顺利进行测试。 ... [详细]
  • 在《JavaScript进阶之旅:第三阶段深入探索》中,我们将通过一系列复杂的代码示例,深入探讨JavaScript的高级特性与应用技巧。本阶段将重点讲解如何利用用户输入进行动态交互,例如通过提示框获取1到9之间的正整数,并基于此实现更多功能。此外,还将介绍如何优化代码结构,提升程序的可读性和维护性。 ... [详细]
  • 【高效构建全面的iOS直播应用】(美颜功能深度解析)
    本文深入探讨了如何高效构建全面的iOS直播应用,特别聚焦于美颜功能的技术实现。通过详细解析美颜算法和优化策略,帮助开发者快速掌握关键技术和实现方法,提升用户体验。适合对直播应用开发感兴趣的开发者阅读。 ... [详细]
  • 安卓和ios是什么意思安卓和iOS是移动设备上的两款操作系统。安卓英文名为Android,是美国谷歌公司基于Linux内核开发的操作系统。iOS原名iPhoneOS,是由美国苹果公 ... [详细]
author-avatar
討厭香菇_748
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有