探索 iOS 和 macOS 应用开发:从 UIKit 到 AppKit
1. iOS 应用开发基础概述
在开发 iOS 应用时,要让一个简单的应用在模拟器中运行,需要了解大量信息,不过 Xcode 为我们提供了很大的帮助。目前我们只是触及了用于开发 iOS 应用的庞大 API 集合的表面。在开发过程中,涉及到如何在 iOS 应用中使用视图控制器,以及 iOS 如何管理视图的内存。同时,还探讨了 iOS 特有的类,以及 iOS 与 OS X 的异同点。
如果你计划开发 iOS 应用并想了解更多,可以参考相关资料进一步学习。
2. 开启 macOS 应用开发:CaseTool 项目创建
现在,我们将目光转向 macOS 应用开发,以 CaseTool 项目为例,详细介绍开发过程。
2.1 创建项目
使用 Xcode 构建项目,具体步骤如下:
1. 运行 Xcode,在启动屏幕上点击“Create a New Xcode Project”(若 Xcode 已运行,选择“File > New > New Project”)。
2. 在 Mac OS X 下的左侧表格中选择“Application”(若未选中),然后选择“Cocoa Application”,点击“Next”设置应用选项。
3. 设置选项时,需要注意以下内容:
-
Product Name
:输入“CaseTool”。
-
Company Identifier
:用于 App Store 区分应用,通常采用反向域名格式,如“com.MySuperCompany”,该字段区分大小写。
-
Class Prefix
:习惯上输入三个或更多字符,这里使用“MSC”作为类名前缀,避免类名冲突。
-
App Store category
:选择“Utilities”,准确描述应用类型。
- 其他选项中,取消选择“Create Document-Based Application”、“Use Core Data”和“Include Unit Tests”,仅选中“Use Automatic Reference Counting”。
4. 最后,选择项目保存目录,可根据需要创建 Git 仓库。创建完成后,在 Xcode 窗口左侧的“CaseTool”组中,会看到项目已包含“MSCAppDelegate.h”、“MSCAppDelegate.m”和“MainMenu.xib”文件,其中“MSCAppDelegate”是应用的控制对象。
2.2 理解 Delegate @interface
使用 Xcode 中的 Interface Builder 编辑器来布局窗口内容,并建立“MSCAppDelegate”与用户界面控件之间的各种连接。以下是“MSCAppDelegate”的头文件示例:
#import <Cocoa/Cocoa.h>
@interface MSCAppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@end
这里的“IBOutlet”和“IBAction”并非真正的 Objective - C 关键字,而是供 Interface Builder 使用的标志。“IBOutlet”用于标记可连接到其他对象的实例变量,“IBAction”用于标记可作为按钮点击等用户界面操作目标的方法。
2.3 使用 Interface Builder
Interface Builder 是 Xcode 中用于设计用户界面的强大工具。打开“MainMenu.xib”文件,进入 Interface Builder 编辑器。虽然文件扩展名为“.xib”,但实际上是 nib 文件的 XML 格式,编译时会转换为 nib 格式。
在编辑器中,左侧的 Interface Builder dock 包含代表 nib 文件内容的图标,点击底部的圆形箭头可展开显示对象名称。顶部是应用的菜单栏,下方是用于放置文本字段和按钮的窗口。通过点击右下角库面板中的第三个图标(看起来像盒子),可切换到对象库,其中包含各种可拖入窗口的对象,还可使用搜索框筛选。
2.4 布局用户界面
按照以下步骤布局用户界面:
1. 从对象库中找到“Text Field”,拖入窗口,拖动时会出现蓝色指导线,帮助按照 Apple 用户界面规范布局。
2. 拖动“Label”到窗口,用于显示大小写转换结果。
3. 找到“Push Button”,拖到标签下方,双击按钮编辑标签为“UpperCase”。
4. 再拖动一个按钮,将标签改为“LowerCase”。
5. 对文本字段和窗口进行调整,使界面更加美观,确保标签宽度能显示输入的文本。
2.5 建立连接
2.5.1 连接 Outlets
使用 Assistant Editor 建立连接,具体操作如下:
1. 点击 Xcode 窗口右上角“Editor”的中间按钮,将编辑器垂直分割为两个,即 Assistant Editor。若需要更多空间,可将 dock 切换到最小版本,仅显示图标。
2. 按住 Control 键,从文本字段拖动到头部文件的
@property
行下方,直到出现“Insert Outlet or Action”消息,松开指针后,在弹出的对话框中输入“textField”,点击“Connect”,为标签重复此过程,命名为“resultsField”。
3. 在 Inspector 的 Connections 面板中检查连接情况,可通过“View > Utilities > Show Connection Inspector”或点击 Inspector 上的 Connections 按钮查看。
2.5.2 连接 Actions
控制按钮与代码的交互,步骤如下:
1. 控制点击“UpperCase”按钮,拖动到头部文件的最后一个
@property
下方,将连接类型改为“Action”,输入“uppercase”,点击“Connect”,创建方法原型和空实现。
2. 对“LowerCase”按钮重复上述操作,将名称改为“lowercase”。
通过以上步骤,我们完成了 CaseTool 项目的界面布局和连接设置。在实践中,布局对象和建立连接可能会比较慢,但通过练习会逐渐提高效率。
以下是创建项目的流程图:
graph LR
A[运行 Xcode] --> B[创建新项目]
B --> C[选择 Cocoa Application]
C --> D[设置选项]
D --> E[选择保存目录]
E --> F[项目创建完成]
以下是设置选项的表格总结:
| 选项 | 说明 |
| ---- | ---- |
| Product Name | CaseTool |
| Company Identifier | 反向域名格式,如 com.MySuperCompany |
| Class Prefix | MSC |
| App Store category | Utilities |
| 其他选项 | 取消选中 Create Document-Based Application、Use Core Data、Include Unit Tests,选中 Use Automatic Reference Counting |
3. 实现 AppDelegate 功能
3.1 理解 IBOutlet 工作原理
当应用启动时,会自动加载
MainMenu.xib
文件,其中存储的对象会被重新创建,这意味着在幕后会执行
alloc
和
init
操作。在初始化
MSCAppDelegate
实例时,所有
IBOutlet
实例变量初始值为
nil
。只有当 nib 文件中的所有对象(包括窗口、文本字段和按钮)创建完成后,所有连接才会建立。此时,会向每个创建的对象发送
awakeFromNib
消息。需要注意的是,对象的创建和
awakeFromNib
消息的发送没有预定义的顺序。
一个常见的错误是在
init
方法中尝试使用
IBOutlet
进行操作。由于此时所有实例变量为
nil
,对它们发送的消息都不会产生任何效果,任何在
init
方法中尝试的操作都会无声失败。如果遇到代码不工作的情况,可以使用
NSLog
打印实例变量的值,检查是否都为
nil
。
3.2 实现 MSCAppDelegate
以下是
MSCAppDelegate
的实现代码:
#import "MSCAppDelegate.h"
@implementation MSCAppDelegate
- (id) init
{
if (nil != (self = [super init]))
{
NSLog (@"init: text %@ / results %@", _textField, _resultsField);
}
return self;
}
- (void)awakeFromNib
{
NSLog (@"awake: text %@ / results %@", _textField, _resultsField);
[_textField setStringValue:@"Enter text here"];
[_resultsField setStringValue:@"Results"];
}
- (IBAction) uppercase: (id) sender
{
NSString *original = [_textField stringValue];
NSString *uppercase = [original uppercaseString];
[_resultsField setStringValue:uppercase];
} // uppercase
- (IBAction) lowercase: (id) sender
{
NSString *original = [_textField stringValue];
NSString *lowercase = [original lowercaseString];
[_resultsField setStringValue:lowercase];
} // lowercase
@end
3.2.1
init
方法
虽然在这个项目中
init
方法不是必需的,但它可以展示在初始化时
IBOutlet
实例变量没有值的情况。在
init
方法中,使用
NSLog
打印
_textField
和
_resultsField
的值,此时它们为
nil
。
3.2.2
awakeFromNib
方法
awakeFromNib
是设置文本字段默认值的理想位置。使用
NSTextField
的
setStringValue:
方法,将文本字段设置为更友好的默认值,即
Enter text here
和
Results
。
3.2.3
uppercase:
方法
当点击
UpperCase
按钮时,会调用
uppercase:
方法。该方法首先从
_textField
获取原始字符串,然后使用
NSString
的
uppercaseString
方法将其转换为大写字符串,最后将结果设置到
_resultsField
中。
3.2.4
lowercase:
方法
lowercase:
方法与
uppercase:
方法类似,只是将字符串转换为小写。
3.3 内存管理检查
在
uppercase:
和
lowercase:
方法中,创建的新对象(
original
和
uppercase
或
lowercase
字符串)来自非
alloc
、
copy
或
new
方法,因此它们会被自动放入自动释放池,在适当的时候会被清理。
setStringValue:
方法负责处理传入字符串的复制或保留操作,我们可以确定内存管理是正确的。
4. 运行 CaseTool 项目
完成上述所有步骤后,运行程序,会看到窗口出现。在文本字段中输入字符串,点击
UpperCase
或
LowerCase
按钮,即可将输入的字符串转换为大写或小写,并在结果标签中显示,就像下面的流程图所示:
graph LR
A[启动程序] --> B[显示窗口]
B --> C[输入字符串]
C --> D{点击按钮}
D -->|UpperCase| E[转换为大写]
D -->|LowerCase| F[转换为小写]
E --> G[显示结果]
F --> G[显示结果]
以下是操作步骤的总结表格:
| 步骤 | 操作 |
| ---- | ---- |
| 1 | 启动程序,显示窗口 |
| 2 | 在文本字段输入字符串 |
| 3 | 点击
UpperCase
或
LowerCase
按钮 |
| 4 | 查看结果标签显示转换后的字符串 |
通过以上步骤,我们成功开发了一个简单的 macOS 应用程序 CaseTool,它可以实现字符串的大小写转换功能。在开发过程中,我们学习了如何使用 Xcode 创建项目、使用 Interface Builder 布局用户界面、建立连接以及实现应用的核心功能。不断练习和实践,将有助于我们更熟练地掌握 iOS 和 macOS 应用开发技术。
超级会员免费看
672

被折叠的 条评论
为什么被折叠?



