0%

创建新项目的时候系统会自动创建一个显示页面,比如 vs code 的,这都是默认显示的窗口
VSCode
但是我们想手动调用这个默认窗口的话,系统也提供了一些方法,可以直接显示出来

1
2
- (void)orderFrontStandardAboutPanel:(id)sender;

也可以使用下面这个方法设置窗口里面要显示的内容

1
- (void)orderFrontStandardAboutPanelWithOptions:(NSDictionary<NSAboutPanelOptionKey, id> *)optionsDictionary;

接受参数是一个字典 key 是 NSAboutPanelOptionKey

orderFrontStandardAboutPanel实现就是调用 orderFrontStandardAboutPanelWithOptions 传参 nil 实现的。

具体使用方法 :

阅读全文 »

监听键盘鼠标事件

今儿要做一个监听全局的键鼠事件的操作,之前使用的都是指监听应用内某一个控件的事件
只需要空间是继承 NSResponder 的就可以了,按需实现下面的方法就行了
NSResponder

阅读全文 »

Cocoa中WebView允许选择本地上传文件

Cocoa中使用 webview 加载URL显示网页,在进行选择文件上传时候

1
2
<input type="file" name="uploadfile">

在webview上不能正常的弹出选择器,cef正常。

WebUIDelegate

解决该问题只需要实现 WebUIDelegate 的代理方法

1
2
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener;

实现内容

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
#pragma mark -  webview
/// <input type="file">
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id<WebOpenPanelResultListener>)resultListener {
// Create the File Open Dialog class.
NSOpenPanel* openDlg = [NSOpenPanel openPanel];

// Enable the selection of files in the dialog.
[openDlg setCanChooseFiles:YES];

// Enable the selection of directories in the dialog.
[openDlg setCanChooseDirectories:NO];

if ([openDlg runModal] == NSOKButton)
{
NSArray* URLs = [openDlg URLs];
NSMutableArray *files = [[NSMutableArray alloc]init];
for (int i = 0; i <[URLs count]; i++) {
NSString *filename = [[URLs objectAtIndex:i]relativePath];
[files addObject:filename];
}

for(int i = 0; i < [files count]; i++)
{
NSString* fileName = [files objectAtIndex:i];
[resultListener chooseFilename:fileName];
}
}
}

参考

今天重新生成了github的ssh key,添加完以后发现提示

1
2
3
4
5
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

然后查了一下资料,因为我在创建的时候给文件输入了个名字

1
2
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/murphy/.ssh/id_rsa): github

可以通过ssh-add ~/.ssh/your_file_name的方式解决。
也可以在 ~/.ssh/ 目录下编辑config配置文件

1
2
3
4
5
6
vi config

Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_rsa

User 就是用户名

最后验证一下 ssh -T git@github.com

#CocoaPods私有库

私有库版本库

  • 创建版本库(repo)私有库的一个索引 建一个git空仓库
  • 执行Pod repo list列出本地的所有的版本库
  • 执行pod repo add repo的名字 git地址将索引库添加到本地

创建私有库项目

创建项目pod lib create <项目名称> Assets 资源文件 Class 源码文件。
根据命令行提示一步步执行,然后就写代码招呼吧。
提交代码的时候记得添加tag一起提交 与 .podspec里面的version一致
pod lib lint 检查配置文件,通过以后可以提交
pod repo push 版本库名称 组件库名字.podspec

pod lib lint 和 pod spec lint 命令分别是对podspec的本地校验和远程校验

配置依赖

自己写的cocoapods库中引用其他第三方库只需要在.podspec文件中设置 s.dependency 'AFNetworking', '~> 2.3'这样的就可以了。但是如果你依赖的是自己的私有库,就会有点问题,需要麻烦一点弄一下。

依赖私有库

私有库配置依赖中引用其他私有库,在.podspec 中的写法和上面一样 s.dependency 'LDKeychain', '~> 0.1.0' |LDKeychain就是我自己的之前写的私有库,通过 dependency 引用私有库文件。

但是我们在验证.podspec和往自己的私有repo中提交的时候会报错。
只需要如下操作

DeviceUniqueKey.podspec 为我的创建的私有库,repo_name是版本库的名字

需要在 pod lib lint 命令是加上 –sources repo地址。例如:
本地验证

1
pod spec lint xxx.podspec --sources=http://xxx@git.xxx.xx/xx/myRepo.git,https://github.com/CocoaPods/Specs.git

验证远程版本库

1
pod lib lint DeviceUniqueKey.podspec --sources=https://github.com/CocoaPods/Specs.git,xxx.xxx.xxx.xxx/iOS/repo_name.git

pod repo push 时也需要在命令上加上–sources 例如:

1
pod repo push lenovo-specs-repo DeviceUniqueKey.podspec —sources=ssh://git@xxx.xxx.xxx.xxx/iOS/repo_name.git  --allow-warnings 

--allow-warnings 表示忽略警告。

完事记得pod repo update repo_name一下

Git tag

  • git tag 列出所有标签
  • git show tag_name 列出该标签的版本信息
  • git tag tag_name 创建名字为tag_name的标签
  • git push origin tag_name推送制定的标签
  • git push origin - -tags 推送本地所有新增的标签
  • git tag -d tag_name 删除本地名字为tag_name的标签
  • git push origin :refs/tags/tag_name 删除云端名字为tag_name的标签

Finder Sync

macOS 上的Finder App 的应用拓展 可以控制显示文件/文件夹的的图标,控制选中文件/文件夹的的右键菜单操作。
在工程中新建target的 选 Finder Sync 就行了,默认会创建一些示例代码。
Finder Sync 和 主app 通信可以使用 URL Scheme 规则进行数据传递,共享数据的话设置一下 App Groups 。也可以主app启动个本地 http server 进行通信也可以。

block内存管理,先看几个例子

1
2
3
4
5
6
7
8
9
1.
int a = 0;
void (^block)(void) = ^ {
printf("in block a = %d,%p\n",a,&a);
};
a = 1;
block();
printf("after block a = %d,%p\n",a,&a);

1
2
3
4
5
6
7
8
9
2.
__block int a = 0;
void (^block)(void) = ^ {
printf("in block a = %d,%p\n",a,&a);
};
a = 1;
block();
printf("after block a = %d,%p\n",a,&a);

1
2
3
4
5
6
7
8
9
3.
__block int a = 0;
void (^block)(void) = ^ {
printf("in block a = %d,%p\n",a,&a);
a = 2;
};
a = 1;
block();
printf("after block a = %d,%p\n",a,&a);

输出分别是

1
2
3
4
5
6
7
8
9
1.
in block a = 0,0x600000252ec0
after block a = 1,0x7ffee71c8104
2.
in block a = 1,0x600000429ef8
after block a = 1,0x600000429ef8
3.
in block a = 1,0x60000042b118
after block a = 2,0x60000042b118

输出中不难看出在1中变量 a 在 block 中被 copy 了生成了新的地址。经过 __block修饰符声明的变量在 block 中就是同一个地址。