iClean

令人费解的AppKit

脱离nib 和 storyboard 开发方式

nib和storyboard 千好万好。但在多人开发模式下,修改同一份storyborad,产生的冲突简直是灾难。

干掉项目中info.plist 关于Main.storyboard的设置。在main.m中手动绑定AppDelegate

1
2
3
4
5
6
7
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"
int main(int argc, const char * argv[]) {
AppDelegate *app = [[AppDelegate alloc] init];
[NSApplication sharedApplication].delegate = app;
return NSApplicationMain(argc, argv);
}

按照iOS的开发经验,Window下要放置一个ViewController。需要注意的是重写loadview方法不要调用super

1
Instantiates a view from a nib file and sets the value of the view property.

super会去加载同名的nib文件。正确的纯编码方式是不调用父类方法,再自己设置一个NSView即可。

1
2
3
4
5
- (void)loadView{
self.view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, iCleanMainWindowWidth, iCleanMainWindowHeight)];
self.view.wantsLayer = YES;
self.view.layer.backgroundColor = [NSColor brownColor].CGColor;
}

NSTableView

编码使用NSTableView的话,要配置使用NSScorllViewNSTableColumn。 具体实践是:

1
2
3
4
5
6
7
8
9
10
11
12
13
_scrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(iCleanMainWindowWidth - 400, 0, 400, iCleanMainWindowHeight)];
_scrollView.hasVerticalScroller = _scrollView.hasVerticalRuler = YES;
_scrollView.hasHorizontalScroller = _scrollView.hasHorizontalRuler = NO;

_tableView = [[NSTableView alloc] initWithFrame:_scrollView.bounds];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.headerView = nil;
_scrollView.contentView.documentView = _tableView;

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:@"col1"];
col.minWidth = 400;
[_tableView addTableColumn:col];

其中NSTableDataSourceNSTableViewDelegate 虽然都是optional的办法。但仍需要实现下面的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#pragma mark - NSTableViewDelegate
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row{
NSTextField *cell = [tableView makeViewWithIdentifier:@"cellReuseId" owner:self];
if(!cell){
cell = [NSTextField labelWithString:@""];
cell.identifier = @"cellReuseId";
}

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ \n%@",self.data[row].path.lastPathComponent,self.data[row].formatSize] attributes:@{NSForegroundColorAttributeName:[NSColor blackColor]}];

cell.placeholderAttributedString = str;
return cell;
}

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row{
return 50.f;
}

- (void)tableViewSelectionDidChange:(NSNotification *)notification{
NSInteger row = [[notification object] selectedRow];
NSLog(@"%ld",row);
}



#pragma mark - NSTableViewDataSource
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView{
return self.data.count;
}

注意是 AppKit里面是没有Label控件的,我这是使用的是NSTextField。就是输入框了,借助placeholderString属性能实现文本展示的效果。

目前的产品形态