Mac_Os开发第二天

学习Mac开发第四节 学习NSSlider

认识NSSlider

层级结构   Inherits From: NSControl -> NSView -> NSResponder -> NSObject 


获取NSSlider滑动后的值

拖拽到.m文件一个Action,可以获取浮点型和整数型的值

- (IBAction)sliderAction:(id)sender {

NSSlider *slider = (NSSlider *)sender;

//self.sliderValue.stringValue = [NSString stringWithFormat:@"%f",slider.floatValue];

slider.stringValue = [NSString stringWithFormat:@"%ld",(long)slider.integerValue];

}


效果如图

修改背景颜色

#import "MyCustomSlider.h"

@implementation MyCustomSlider

- (void)drawBarInside:(NSRect)rect flipped:(BOOL)flipped {

//  [super drawBarInside:rect flipped:flipped];

rect.size.height = 5.0;

// Bar radius

CGFloat barRadius = 2.5;

// Knob position depending on control min/max value and current control value.

CGFloat value = ([self doubleValue]  - [self minValue]) / ([self maxValue] - [self minValue]);

// Final Left Part Width

CGFloat finalWidth = value * ([[self controlView] frame].size.width - 8);

// Left Part Rect

NSRect leftRect = rect;

leftRect.size.width = finalWidth;

NSLog(@"- Current Rect:%@ \n- Value:%f \n- Final Width:%f", NSStringFromRect(rect), value, finalWidth);

// Draw Left Part

NSBezierPath* bg = [NSBezierPath bezierPathWithRoundedRect: rect xRadius: barRadius yRadius: barRadius];

[NSColor.orangeColor setFill];

[bg fill];

// Draw Right Part

NSBezierPath* active = [NSBezierPath bezierPathWithRoundedRect: leftRect xRadius: barRadius yRadius: barRadius];

[NSColor.purpleColor setFill];

[active fill];

}

@end

自定义Slider  go to download custom slider


学习Mac开发第五节 学习objective-c 调用shell 脚本

NSString* shellPath = @"/Users/主机名/Desktop/tool/LSUnusedResources-master/simian/bin";

NSString* path =[shellPaht stringByAppendingString:@"/aksimian.sh"];

NSTask *task = [[NSTask alloc] init];

[task setLaunchPath: @"/bin/sh"];

//数组index 0 shell路径, 如果shell 脚本有输入参数,可以加入数组里,index 1 可以输入$1 @[path,@"$1"],依次延后。

NSArray *arguments =@[path];

[task setArguments: arguments];

[task launch];


学习Mac开发第六节  学习NSOpenPanel 选择路径和创建文件夹

NSOpenPanel* panel = [NSOpenPanel openPanel];

__weak typeof(self)weakSelf = self;

//是否可以创建文件夹

panel.canCreateDirectories = YES;

//是否可以选择文件夹

panel.canChooseDirectories = YES;

//是否可以选择文件

panel.canChooseFiles = YES;

//是否可以多选

[panel setAllowsMultipleSelection:NO];

//显示

[panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) {

//是否点击open 按钮

if (result == NSModalResponseOK) {

//NSURL *pathUrl = [panel URL];

NSString *pathString = [panel.URLs.firstObject path];

weakSelf.urlTextField.stringValue = pathString;

     }

}];

// 悬浮电脑主屏幕上

//    [panel beginWithCompletionHandler:^(NSInteger result) {

//

//    }];


学习Mac开发第七节 学习NSTableView Cell Base

创建列表

1.在故事版上的ViewContoller 上面拖拽个tablview 并且把列表代理拖拽到控制器上。

2.设置3个栏目如下图

3.分别设置3个栏目名称为ID ,name image

4.指定每个栏目对象cell的唯一标识符

对应如下

ID->userid name->username image->useravatar

把image下面的TextCell 修改为imageCell 用来显示图片


1.创建个UserDetailDataModel 数据Model 属性名称要和上面的标识符对应

#import@interface UserDetailDataModel : NSObject

@property (strong, nonatomic)NSString *userid;

@property (strong, nonatomic)NSString *username;

@property (strong, nonatomic)NSImage *useravatar;

@end

设置tablview delegate 和datasource

//  ViewController.m

//  NSTablviewDemo//

//  Created by wufeng on 17/05/28.//  Copyright © 2017年 zhule.com. All rights reserved.

//#import "ViewController.h"

#import "UserDetailDataModel.h"

@interface ViewController ()@property (strong, nonatomic)NSMutableArray *dataSource;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.dataSource = [NSMutableArray new];

//设置Cell 高度

[self.tablview setRowHeight:45];

//创建数据Model

NSArray *userIdArray = @[@"101",@"102",@"103",@"104"];

NSArray *userNameArray = @[@"Allen",@"Jack",@"Luck",@"Tony"];

NSArray *userAvatarArray = @[[NSImage imageNamed:@"tag_1.png"],[NSImage imageNamed:@"tag_2.jpg"],[NSImage imageNamed:@"tag_3.jpg"],[NSImage imageNamed:@"tag_4.jpeg"]];

for (NSInteger i = 0; i < userNameArray.count; i++) {

UserDetailDataModel *detail = [[UserDetailDataModel alloc]init];

detail.userid = userIdArray[i];

detail.username = userNameArray[i];

detail.useravatar = userAvatarArray[i];

[self.dataSource addObject:detail];

  } 

[self.tablview reloadData];

// Do any additional setup after loading the view.

}

#pragma mark TablviewDataSource

//cell 个数

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {

return  self.dataSource.count;

 }

//设置列表Value

- (nullable id)tableView:(NSTableView *)tableView objectValueForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row{

if([self.dataSource count] <= 0){

return nil;

      }

UserDetailDataModel *detail = self.dataSource[row];

return  [detail valueForKey: [tableColumn identifier]];

}

//cell绑定对象模型

- (void)tableView:(NSTableView *)tableView setObjectValue:(nullable id)object forTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row {

UserDetailDataModel *detail = self.dataSource[row];

[detail setValue:object forKey: [tableColumn identifier]];

}

- (void)setRepresentedObject:(id)representedObject {

[super setRepresentedObject:representedObject];

// Update the view, if already loaded.

}



列表高度设置

[self.tablview setRowHeight:45];

//或者

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row{

return 45;

}

设置标题居中


设置列表文字居中

设置Text Cell 居中模式


效果如上

总觉得怪怪的,居然没有上下居中这么能忍 Google 下,解决方案重写NSTextFieldCell

代码来自

#import <Cocoa/Cocoa.h>

@interface RSVerticallyCenteredTextFieldCell : NSTextFieldCell{

BOOL mIsEditingOrSelecting;

}

@end

#import "RSVerticallyCenteredTextFieldCell.h"

@implementation RSVerticallyCenteredTextFieldCell

- (NSRect)drawingRectForBounds:(NSRect)theRect{

// Get the parent's idea of where we should draw

NSRect newRect = [super drawingRectForBounds:theRect];

// When the text field is being

// edited or selected, we have to turn off the magic because it screws up

// the configuration of the field editor.  We sneak around this by

// intercepting selectWithFrame and editWithFrame and sneaking a

// reduced, centered rect in at the last minute.

if (mIsEditingOrSelecting == NO){

// Get our ideal size for current text

NSSize textSize = [self cellSizeForBounds:theRect];

// Center that in the proposed rect

float heightDelta = newRect.size.height - textSize.height;

        if (heightDelta > 0){

          newRect.size.height -= heightDelta;

          newRect.origin.y += (heightDelta / 2);

       }

 }

return newRect;

}

- (void)selectWithFrame:(NSRect)rect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(nullable id)delegate start:(NSInteger)selStart length:(NSInteger)selLength{

rect = [self drawingRectForBounds:rect];

mIsEditingOrSelecting = YES;

[super selectWithFrame:rect inView:controlView editor:textObj delegate:delegate start:selStart length:selLength];

mIsEditingOrSelecting = NO;

}

- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent{

aRect = [self drawingRectForBounds:aRect];

mIsEditingOrSelecting = YES;

[super editWithFrame:aRect inView:controlView editor:textObj delegate:anObject event:theEvent];

mIsEditingOrSelecting = NO;

}

@end

修改成重写的类



效果如图

监听单击事件

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification{

NSInteger currenSelectRow = [self.tablview selectedRow];

NSLog(@"selectRow=========%ld",(long)currenSelectRow);

}

添加双击事件

在viewDidLoad里面添加如下代码

[self.tablview setDoubleAction:@selector(tableViewDoubleClicked)];

self.tablview.allowsEmptySelection =  YES;

学习mac开发第八节 10分钟学会数据库简单操作

简单介绍下我们将用什么数据库,能在10分钟就能会。 它就是Realm,在之前我从来没用他开发。只是传说听过他的强大,居然在我简单的看了一眼文档居然就上手操作,我不在这里过分介绍他了,网上很多了,官网也有中文介绍。下面会总结我遇到的一些问题吧。realm 本身有很多强大的功能,本文只是花10分钟在mac 开发中实践了简单的增删改查

他的优点很明显:简单、live objec、线程安全、懒加载、离线优先


接入realm库 采用了最简单的方法下载后把库拖到工程里,当然你也可以采用cocoapods 方式

拖拽后确认是否成功引入 如下图


如果需要上传AppStroe 需要创建RunScript 添加 下面。

bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh"


要实现一个能够录入学生姓名,年龄,性别,地址,当然还有一个唯一的学号

首先我们来创建一个学生对象

import Cocoa

import RealmSwift

class StudentModel: Object {

dynamic var studentName = ""

dynamic var studentAge = 0

dynamic var studentID  = 1

dynamic var studentSex = ""

dynamic var studentAddress = ""

//主键

override static func primaryKey() -> String? {

return "studentID"

  }

}

用学生的学号当做唯一的主键,方便我们快速查询。

下面搭建个简单的页面


下面是简单的添加方法

//把数据添加Realm 数据库中

func addStudent() {

//没有自增主键

let lastStudent = realm.objects(StudentModel.self).sorted(byKeyPath:"studentID", ascending: true).last

let studentModel = StudentModel()

studentModel.studentAge = Int(self.ageTextField.intValue)

studentModel.studentSex = self.sex!

studentModel.studentAddress = self.addressTextField.stringValue

studentModel.studentName =  self.nameTextField.stringValue

if lastStudent?.studentID != nil {

studentModel.studentID = lastStudent!.studentID + 1

   }else {

studentModel.studentID = 1;

   }

weak var weakSelf = self

try! realm.write {

realm.add(studentModel)

weakSelf?.hintLable.stringValue = "添加成功"

    }

}

我最初的想法是主键自增,后来没有发现相对应的Api.只能排序后去找最后一个学生的学号加一当前学生的学号。因为 Realm 是一个 MVCC 数据库 ,底层用 C++ 编写。MVCC 指的是多版本并发控制。这样的机制导致没法自增主键。如果敢兴趣可以看其他文章详情介绍。

官网提供了Realm Browse 工具,方便查看数据库的改变。 我们可以通过下面代码找到数据库的位置

print(("Path to realm file: " + realm.configuration.fileURL!.absoluteString))

增加

下面我们添加一名学生吧 学生studentID 为 1


下面通过学生studentID = 1 条件查询这个学生的信息

//全局变量lazy var realm = try! Realm()

//查询学生的modelvar item:StudentModel! = nil

//搜索结果集合var searchValue:Results?

查询

searchValue = realm.objects(StudentModel.self).filter("studentID = %d",studentValue!)

self.item = searchValue![0]

或者 也可以用NSPredicate 方式查询

let predicate = NSPredicate(format: "studentID = %d",studentValue)

searchValue = realm.objects(StudentModel.self).filter(predicate)


查询的核心代码就一句。但是很遗憾我没有发现可以到直接返回对象而不是集合的方法.如何你发现了留言告诉我一声,有时间我在查查资料。

修改

修改下查询后人员的地址把china 改成USA 代码如下

try!  realm.write {

self.item.studentAddress = self.changAddressTextField.stringValue;

}


效果如图

删除

try! realm.write {

if self.item != nil {

realm.delete(self.item)

 }

}

// Delete all objects from the realm

try! realm.write {

realm.deleteAll()

}

下载地址

学习Mac开发第十节 Image Well


简单翻译的一下:以允许用户拖拽一张图片放到这个图片视图上。

如果你用一个图片压缩软件就会发现,用户可以直接拖拽一张图片放上去就显示的功能。

下面我们在storyboard 拖拽一个吧,居中显示,并且设置一个默认的图片吧,来表示用户可以添加图片。


运行起来发现拖拽图片没有效果,那就查看下API。


已经说的很清楚了 editable = Yes 时候才可以拖拽。

在属性面板上就有这个属性,点下勾就可以。


这时候我们发现就可以轻松的拖拽个图片到上面去了。

当我选中后点击delete键 后删除图片,后现默认图片也消失了。如果想保留默认图片可以判读是否为空,空的时候在添加上去就可以了。

- (IBAction)touchImageView:(id)sender {

NSImage *defaultImage = [NSImage imageNamed:@"add"];

if (!self.imageWell.image) {

self.imageWell.image = defaultImage;

  }

}

当然你也可以通过这个事件添加图片。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容