Text View算是Mac里面最常用但是最复杂的控件之一,我也是用了一下午的时间才知道如何使用这个控件,Mac控件并不像VC或者C#一样直观上是消息通信模式,也不是通过事件,添加相应对象的子节点去增加控件内容。Text View算是比较特别的控件,复杂的Text View控件可以做出很多复杂的效果,在iPhone上更是如此,最有名的软件如Twitterrific的Mac版本和iPhone版本显示Twits都是使用的Text View。Text View就好像C#中的Gridview,或者C++的listbox。
首先我们创建一个项目叫TextViewTest,创建好之后,我们在Class文件夹下面添加一个类,取名叫Controller(这里可以创建位NSObject或者位NSView的子类都可以)。
创建好之后,我们打开MainWindow.xib文件,然后制作UI如下图所示,我们的需求很简单,单击按钮添加一行数据。
编写好了UI之后,我们就需要连接一些基本的东西,这里我们拖动一个Object对象进来,并改成相应的Class。
拖动过来还需要更改为相应的Controller。
更改后,我们的这个Controller就是我们的Controller类的一个对象了。这里我们需要写一下Controller类,头文件我们可以定义如下。
#import <Cocoa/Cocoa.h>
@interface Controller : NSView {
//定义数据源数组
NSMutableArray *array;
//定义数据源数组的Controller,连接用
IBOutlet NSArrayController *arrayController;
IBOutlet NSButton *button;
}
@property (nonatomic,retain) IBOutlet NSButton *button;
- (void) buttonClicked:(id)sender;
@end
然后我们实现的代码很简单,每次点击都添加一个test字符串。
#import "Controller.h"
@implementation Controller
@synthesize button;
- (void) buttonClicked:(id)sender
{
//添加字符串
[arrayController addObject:@"test"];
}
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
// Drawing code here.
}
@end
编写完成后,我们还需要连接各个对象,例如button连接到代码中的button,button的按下的事件连接到buttonClicked。这里我就不累述了。
Text View是一个可以进行数据绑定的控件,所以前面我才说和C#的GridView很像,不过没有VS那么智能了,这里Text View绑定的是类似数组的对象,所以这里我们还需要拖动一个Arrray Controller,进行数据的连接。
拖动完成之后,我们就需要连接Controller和Array Controller,这两个对象组成一个类+数据源的结构。
拖动完成后,我们需要绑定相应的对象,例如上面绑定的是arrayController,也是我们前面代码定义的一个变量,否则看不到这个连接项。这个时候我们连接前面定义的arrayController,就连接了Array Controller。连接后,我们还需要设置绑定,我们在Array Controller的属性窗口中设置即可。
上图我们就将Array Controller绑定了Controller里的array变量。也就是说Array Controller现在已经成为了数据源,任何array对象的改变都会影响到这个Array Controller。
现在我们再打开UI,找到相应的一列,选中该列(而不是选中大的控件,是其中一列,如下图)。
选中该列,然后在属性窗口中绑定相应的数据源即可,如下图。
绑定完成后,我们只需要操作arrayController里面的元素就可以了,而不需要关心如何绑定到Text View中的,如下代码。
[arrayController addObject:@"test"];
连接完成后的Controller和Array Controller里的连接如下两图所示。
小结一下:
使用Text View的基本步骤如下。
- 写Controller,并连接。
- 创建Array Controller并绑定。
- 绑定相应的Text View的列。
虽然看上去很简单,但是实践起来还是有一定难度的,建议各位自己动手实践一下。