Objective-C学习笔记第十四章AppKit

时间:2024-05-22 15:18:40
第十四章AppKit
在这一章将从Foundation Kit框架转移到Application Ki框架,来创建一个可以用于Mac的桌面程序
一、构建项目
进入Xcode,创建一个新Cocoa Application项目,从File菜单选择New Project,选择Cocoa Application,并输入新项目的名称
Objective-C学习笔记第十四章AppKit
接下来在建好的项目中添加新的Objective-C类文件,起名字,并确保选中了Also create AppController.h复选框
Objective-C学习笔记第十四章AppKit
Objective-C学习笔记第十四章AppKit
二、构建AppController @interface
我们将使用Interface Builder来布局窗口内容,在AppController于用户界面控件之间进行各种连接

#import <Cocoa/Cocoa.h>

@interfaceAppController : NSObject {

     IBOutlet NSTextField *textField;     //NSTextField文本标签类   textField对象是要输入转换字符串的地方

     IBOutlet NSTextField *resultsField;   //resultsField是转换完显示结果的地方

}

-(IBAction)uppercase:(id)sender;   //转换大写方法,需获取参数sender(点击的NSButton对象)

-(IBAction)lowercase:(id)sender;

@end//Appcontroller

两个类似的关键字IBOutlet 和 IBAction,他们实际上只是AppKit提供的#defines
IBOutlet的定义没有任何作用,因此不会对他进行编译
IBAction定义为void,这意味着在AppController中声明的方法的返回类型是void,即什么都不返回
IBOutlet 和 IBAction实际上是为Interface Builder以及阅读代码的人提供的标记。通过查找IBOutlet 和 IBAction,Interface Builder知道AppController对象具有两个能够连接的实例变量,这两个方法作为单击按钮的目标
三、Interface Builder
双击项目中的MainMenu.xib文件,这个文件配备了一个菜单栏,以及一个可以加入用户控件的窗口
xib文件旧称nib 是NeXT Interface Builder的缩写,nib文件是包含被冻结的对象的二进制文件
xib文件是XML格式的nib文件,在编译时,xib文件将编译为nib格式
下图是双击后的界面
Objective-C学习笔记第十四章AppKit
Interface Builder打开后有5个窗体出现
1、固定窗体,表示nib文件的内容图标,这是nib文件的主窗口
2、应用程序的菜单栏,可以添加新菜单和菜单项,也可以编辑现有菜单项
3、空窗体,主要编辑区域,其内容与固定窗体1中的图标相对应
4、IB Library,包含可以拖到窗口的对象
5、属性调节面板,顾名思义调节属性用的
接下来开始构建窗体
目的:要告诉Interface Builder创建一个AppController对象,即当程序运行时Cocoa加载nib文件会生成一个
AppController对象
1、将一个NSObject从库面板拖拽到MainMenu.xib固定窗口中,他在库面板中显示名称为Object
Objective-C学习笔记第十四章AppKit
2、在选中固定窗口中刚刚拖拽的Object后,选择菜单栏Tool > Identity Inspector(快捷键Objective-C学习笔记第十四章AppKit6),打开检查器窗口,在其中将类更改为AppController,更改后固定窗口中Object已经改变为AppController
Objective-C学习笔记第十四章AppKit
四、布局用户界面
1、在库中找到TextField,拖拽到窗口中(一下步骤和C#太像了,不再贴图)
2、拖拽一个Label
3、拖拽一个Button,双击按钮编辑其标签为UpperCase
4、拖拽一个Button,双击按钮编辑其标签为LowerCase
最后调整一下如下图效果
Objective-C学习笔记第十四章AppKit
五、连接
1、连接输出口
(1)选择固定窗口中的AppController,按下Control键并从AppController拖到文本域,鼠标所过之处会出现一条美丽的蓝线,拖到文本域时会出现TextField标签
Objective-C学习笔记第十四章AppKit
(2)、释放鼠标,将显示一个包含可能的IB输出口的菜单,选择textField
Objective-C学习笔记第十四章AppKit
(3)、按住Control从AppController拖到Label,选择resultsField完成连接
(4)、选择检查器的Connections面板或使用快捷键Objective-C学习笔记第十四章AppKit5,查看是否连接成功
2、连接操作
选择Button按住Control并拖动鼠标连接到AppController,释放鼠标后选择要连接的方法
Tip:拖动方向的原则--从需要知道某些内容的对象到该对象需要了解的对象
例如:AppController需要知道将那个NSTextField用于用户输入,因此拖动方向是从App到文本域
      按钮需要知道告诉哪个对象有人按他,因此从按钮拖到AppController
六、AppController实现
     一定要先保存nib文件
程序工作原理描述:
1、当加载nib文件时,存储在nib文件中的任何对象会被重新创建(即在后台执行alloc和init方法)
2、当程序启动时,会分配并初始化一个AppController实例
3、在初始化期间,所有IBOutlet实例变量都为nil,只有创建了所有nib文件中的对象,连接才算完成
4、一旦建立了连接(即将NSTextField对象的地址添加到AppController的实例变量中),会向创建的每个对象发送awakeFromNib方法,awakeFromNib不存在预定义的顺序
5、因为初始化中所有实例变量都为nil所以在init中调用IBOutlet不会执行任何操作
实现代码:

#import "AppController.h"

@implementationAppController

-(id)init

{

    if (self = [super init]) {

         NSLog(@"init: text %@ / results %@",    //在初始化时显示IBOutlet实例变量的值,用来证明初始化时是nil

                textField,resultsField);

    }

    return(self);

}

-(void)awakeFromNib                           //awakeFromNib是初始化控件值的最佳方法

{

     NSLog(@"awake: text %@ / results %@",

               textField,resultsField);

     [textField setStringValue:@"Enter text here"];             //初始化控件的文本标签

     [resultsField setStringValue:@"Results"];                //初始化控件的文本标签

}//awakeFromNib

-(IBAction)uppercase:(id)sender

{

     NSString *original;

      original = [textField stringValue];           //stringValue获取对象字符串值

     NSString *uppercase;

      uppercase = [original uppercaseString];            //调用NSString类的uppercaseString方法

      [resultsField setStringValue:uppercase];         //设置文本标签新的值

}//uppercase

 

-(IBAction)lowercase:(id)sender

{

      NSString *original;

       original = [textField stringValue];

      NSString *lowercase;

       lowercase = [original lowercaseString];

       [resultsField setStringValue:lowercase];

}//lowercase

@end

下为效果图
Objective-C学习笔记第十四章AppKit