28、探索 iOS 和 macOS 应用开发:从 UIKit 到 AppKit

探索 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 应用开发技术。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值