Xcode6插件开发
工欲善其事必先利其器,Xcode是我们做iOS Dev必须掌握的一款开发工具。
Xcode本身也是一门Cocoa程序,与其来说它是一个Cocoa程序,是不是意味着,我们可以去动态去让它做某件事,或者监听它的某个事件呢?答案是:当然可以。
Xcode每次打开的时候都会去加载这个目录底下的文件,~/Library/Application Support/Developer/Shared/Xcode/Plug-ins . 这个文件夹底下就是装着所有的Xcode插件。
那么插件究竟是什么?
插件就是在Xcode基础之上,由第三方个人写的一些对Xcode功能的拓展,好用的插件比如,文档注释的
https://github.com/onevcat/VVDocumenter-Xcode
图片有提醒的 KSImageNamed插件,还有鄙人写的快速跳转到 https://github.com/MakeZL/ZLGotoSandboxPlugin 等等很多好用的。
那么插件是如何做出来的呢?
其实做插件最好有一些Cocoa的知识。
我们做一个Hello plugin开始
你会看到一个空的项目,你打开info.plist文件。
需要配置参数
关于Info.plist参数
XC4Compatible = YES, // Xcode 4 编译器
XC5Compatible = YES, // Xcode 5 编译器
XCPluginHasUI = NO, // NO让插件有效
XCGCReady = YES,
DVTPlugInCompatibilityUUIDs = [A2E4D43F-41F4-4FB9-BB94-7177011C9AED,AD68E85B-441B-4301-B564-A45E4919A6AD,C4A681B0-4A26-480E-93EC-1218098B9AA0] // Xcode兼容的UUID
Note: 这样已经配置成功一半了,但还需要配置Build Settings里面的属性才行~
配置:Build Settings
Deployment要配置几个地方
不要急,我把需要改的地方列出来。
改的地方
1.Deployment Location YES
2.Installation Build Products Location 改为 ${HOME}
3.Installation Directory /Library/Application Support/Developer/Shared/Xcode/Plug-ins // 插件地址
4.Skip install NO
恭喜你,已经完成 85%了。
还需要配置Build Settings 里面的 Packaging
1. Warpper Extension 改为 xcplugin
ok! 终于配置完了,接下来,我们要创建一个类,继承NSObject。
在.m中实现
+ (void)pluginDidLoad:(NSBundle *)plugin;
pluginDidLoad就像ViewDidLoad一样。界面一创建完,就调用,pluginDidLoad是插件加载完调用。
好了,我们重启下Xcode。 打开控制台, -> console.
就会看到 Hello world!的字眼了。
一般插件我们都会创造一个单例对象。
监听Xcode发出的通知 ,
NSApplicationDidFinishLaunchingNotification通知是加载完这个插件后发出的。我们可以做一些我们想要做的事情。
- - (instancetype)init{
- if(self = [super init]){
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidFinishLaunching:) name:NSApplicationDidFinishLaunchingNotification object:nil];
- }
- return self;
- }
如果你将接收通知的名字写成nil,将代表你将接收所有Xcode发出的通知。比如切换Xcode,切换导航栏都会调用通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidFinishLaunching:) name:nil object:nil];
给Xcode导航栏添加Menu分类
- Menu *menu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Hello"];
- NSMenuItem *newItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:@"Hello" action:@selector(<#selector#>) keyEquivalent:@""];
- [[NSApp mainMenu] addItem:newItem];
顶部的菜单栏就会出来。 我们可以为newItem分配子subMenu(子Menu)
- newItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:@"Haha"action:NULL keyEquivalent:@"T"];
- [newItem setTag:EmptyTrashItemTag];
- [newItem setTarget:self];
- [newItem setAction:@selector(Haha:)];
- [newMenu addItem:newItem];
第一个小插件完工.
其他通知补充
NSMenuDidChangeItemNotification // 打开新Project
IDEIndexDidChangeStateNotification // 切换Xcode
NSTextDidChangeNotification // 监听Xcode的写入
IDEEditorDocumentDidChangeNotification // 监听工作路径
还有很多需要不断的挖掘~~
插件的优缺点。
插件固然好,但插件多了会令Xcode变的非常卡。因为每个人实现的插件方式不一样,并且有些是非常浪费效率的。 有些比较坑的插件还很容易让Xcode经常卡死.
所以大家尽可能的选择一款比较出名的插件。
Xcode6插件开发的更多相关文章
- iOS-提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
- <转>提高iOS开发效率的方法和工具
介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的ID ...
- 提高iOS开发效率的方法和工具
http://www.cocoachina.com/ios/20150717/12626.html 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先 ...
- iOS开发——实用篇&提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
- JavaScript学习笔记(四)——jQuery插件开发与发布
jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...
- jira的插件开发流程实践
怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...
- Vue插件开发入门
相对组件来说,Vue 的插件开发受到的关注要少一点.但是插件的功能是十分强大的,能够完成许多 Vue 框架本身不具备的功能. 大家一般习惯直接调用现成的插件,比如官方推荐的 vue-router.vu ...
- 【原创】记一次Project插件开发
一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...
- JavaScript学习总结(四)——jQuery插件开发与发布
jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...
随机推荐
- At-rule | CSS @ 规则
译自:MDN(Mozilla开发者网络) At-rule 一.什么是at-rules eg:@charset "utf-8"; at-rule 是CSS样式声明,以@开头,紧跟着是 ...
- GWT事件处理
package com.zly.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.event.do ...
- flash builder4.7安装git插件
如果直接点击Help > Eclipse Marketplace,然后搜索Egit, 以这种方式安装是会失败的!!! 因为版本兼容的问题.依次点击Help > About Flash Bu ...
- PAT---1001. A+B Format (20)
#include<stdio.h> int main(){ //定义要读入的两个整数 int a,b; //定义好放拆项用的数组 ]; //读入两个整数 scanf("%d%d& ...
- Web缩放
可以这么写,这个网页缩放了 同时滚动条也被绽放了,明显结果不正确 webBrowser1.Document.Body.Style = "zoom:200%"; 正解 http:// ...
- DNS的查找机制、中文扩展,及其对手机扫描商标名称的支持
DNS的查找机制.中文扩展.及其对手机扫描商标名称的支持 DNS的查找机制 当DNS查找主机时,它首先在本域里查找,假设找不到则交给更上一级的域查找,直至顶级的域. 因此,假设计算机在北大域名(pku ...
- COCOS2D-X 精灵创建随笔
CCSprite类中创建Sprite的方法都是静态的: static CCSprite* create ( ) 创建一个无图片显示的精灵,可随后用 setTexture 方法设置显示图片 stati ...
- Hadoop书籍汇总
<Hadoop实战>陆嘉恒 <Hadoop - The Definitive Guide>Tom White,中文版<Hadoop权威指南> <Hadoop技 ...
- <div>相关
定义 <div>是一个块级元素[会自动换行] 用法 <div>可用于划分独立的一个块状区域,其内部内容显示在<div>的content部分内 结构 [盗用张图] 从 ...
- Unity3D 获得GameObject组件的方法
Unity3D 获得GameObject组件的方法有几种,这里进行说明一下: 组件: 要获得这些组件,进行操作的话,绑定一个Movescipt 的C#组件,里面的获取方法为 void Update ( ...