Cocoa开发:从按钮交互到应用委托与常用GUI组件
立即解锁
发布时间: 2025-08-21 01:08:25 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从入门到实践
### 打造交互式 Cocoa 应用:从基础到实践
#### 1. 创建控制器类
在开发 Cocoa 应用时,为了处理按钮点击动作,我们需要向 `ButtonAppDelegate` 类添加代码。这个类将作为控制器,处理三个按钮的点击操作。我们在窗口中设置了三个按钮和一个文本字段,当用户按下某个按钮时,文本字段的值应该更新。
操作步骤如下:
1. 打开 nib 文件编辑器,点击主 Xcode 窗口工具栏右侧编辑器组中的“Assistant”按钮(外观像管家的躯干),也可以通过输入 `⌥⌘⏎` 打开辅助编辑器。通过“View ➤ Assistant Editor”下的不同选项,可以将辅助编辑器窗格与 nib 编辑器窗格并排或置于其下方。
2. 辅助编辑器窗格的编辑区域上方的跳转栏会显示当前文件的名称。选择文件名,弹出菜单会显示 `ButtonsAppDelegate.h` 和 `ButtonsAppDelegate.m`。若未选中 `ButtonAppDelegate.h`,则选择它,我们将看到 Xcode 为我们生成的类接口,生成的代码如下(忽略文件顶部的注释块):
```objc
#import <Cocoa/Cocoa.h>
@interface ButtonsAppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@end
```
3. 在 nib 编辑器窗格中,点击添加到窗口的标签。然后,从标签按住 `Control` 键拖动到 `.h` 文件,拖到 `@property` 行下方的空白行,此时文本编辑器中会出现一条蓝色线条,表示插入出口或动作。松开鼠标按钮,会出现一个小弹出窗口,我们可以在其中配置这个新连接。
4. 在弹出窗口中,将连接标记为“Outlet”,并将名称设置为“label”,其他字段保持默认设置,然后点击“Connect”。Xcode 会在 `.h` 文件中添加一行代码:
```objc
@property (weak) IBOutlet NSTextField *label;
```
这个属性声明在我们的类中创建了一个名为 `label` 的新属性,声明中还包含 `IBOutlet` 关键字,这将允许 Xcode 找到我们的出口,并使其在 Interface Builder 中可用。点击跳转栏中的文件名并选择 `ButtonsAppDelegate.m`,可以看到 Xcode 也在类实现中添加了一行代码,该文件现在如下所示:
```objc
#import "ButtonsAppDelegate.h"
@implementation ButtonsAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
}
@end
```
根据 Xcode 的版本不同,可能会看到一行 `@synthesize label`。如果看到这行代码,它会指示编译器为 `label` 属性创建 getter 和 setter 方法。最新版本的 Xcode 不会生成这行代码,因为编译器现在可以自动推断何时需要为属性生成 getter 和 setter 方法,但在旧代码(包括许多 Apple 的示例代码项目)中会看到它。无论是否看到这行代码,由于我们将这个出口连接到了窗口中的标签,当 nib 文件加载时,`label` 属性将自动连接到 `NSTextField` 对象。
#### 2. 实现动作方法
接下来,我们要在类中创建一个动作。在尝试运行程序之前,我们需要编写按钮点击时调用的代码。
操作步骤如下:
1. 在跳转栏中,选择显示 `ButtonsAppDelegate.h`。然后,选择标题为“Left”的按钮,从该按钮按住 `Control` 键拖动到代码中,拖到之前创建的 `@property` 行下方。这次,选择连接类型为“Action”,将动作命名为“buttonPressed:”,其他字段保持默认。点击“Connect”,Xcode 会为我们创建一个新的实例方法,该方法遵循动作的约定。与我们添加的属性一样,当 nib 文件加载时,这个方法也会自动连接。
2. 切换回 `.m` 文件,会看到一个新的空方法:
```objc
- (IBAction)buttonPressed:(id)sender {
}
```
3. 在方法体中输入以下代码,以在标签中显示哪个按钮被按下:
```objc
- (IBAction)buttonPressed:(id)sender {
NSString *title = [sender title];
NSString *labelText = [NSString stringWithFormat:@"%@ button pressed.", title];
[self.label setStringValue:labelText];
}
```
这个方法首先获取调用它的按钮的标题,然后使用该标题创建一个新字符串,最后使用该字符串更新标签。方法使用点符号访问属性,这是 `[self label]` 的简写。
有些 Objective - C 开发者会将消息调用嵌套得很深,例如可能会看到这样的代码:
```objc
[self.label setStringValue:[NSString stringWithFormat:@"%@ button pressed.", [sender title]]];
```
这一行代码的功能与构成 `buttonPressed:` 方法的三行代码完全相同。为了清晰起见,在代码示例中通常不会将 Objective - C 消息嵌套得这么深,但 `alloc` 和 `init` 调用除外,根据长期惯例,它们几乎总是嵌套的。
#### 3. 编译和运行应用
在之前的操作中,我们使用“Simulate Document”命令来处理设置的控件和连接,因为当时没有代码。这次我们有了代码,所以需要实际编译和链接应用。
操作步骤如下:
1. 点击 Xcode 窗口左上角的“Run”按钮,或按下 `⌘R`。如果是第一次尝试运行自定义代码,可能会弹出一个窗口询问是否要在这台 Mac 上启用开发者模式,点击启用,会提示输入密码作为安全措施。
2. 代码应该能干净地编译,然后会看到“Press a Button”窗口。如果点击“Left”按钮,标签应该更新为“Left button pressed.”。如果点击中间或右侧的按钮,不会有任何反应,因为还没有连接这些按钮。
#### 4. 连接其他按钮
为了让中间和右侧的按钮也能正常工作,需要将它们连接到 `buttonPressed:` 动作。
操作步骤如下:
1. 在 nib 中选择“Center”按钮,按住 `Control` 键拖动到 `.h` 或 `.m` 文件中的 `buttonPressed:` 方法。当指针到达有效的动作时,动作会以蓝色轮廓突出显示,并出现一个小窗口显示“Connect Action”,松开鼠标,连接就完成了。
2. 对“Right”按钮执行相同的操作。
3. 再次点击 Xcode 窗口左上角的“Run”按钮,应用将编译并启动。这次,点击任何一个按钮,标签都会更新,一个动作方法可以适当地处理所有三个按钮。
#### 5. 配置应用在窗口关闭时退出
目前,关闭窗口后应用仍在运行,我们可以通过配置应用委托来改变这种行为。
操作步骤如下:
1. 点击 `ButtonsAppDelegate.m`,添加一个名为 `applicationShouldTerminateAfterLastWindowClosed:` 的方法:
```objc
#import "ButtonsAppDelegate.h"
@implementation ButtonsAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
return YES;
}
- (IBAction)buttonPressed:(id)sender {
NSString *title = [sender title];
NSString *labelText = [NSString stringWithFormat:@"%@ button pressed.", title];
```
0
0
复制全文
相关推荐










