xcode7之后有没有xcode8.0代码自动补全全代码的插件fuzz

Xcode很强大,但是有些封闭,官方并没有提供Xcode插件开发的文档。比较全,也比较适合入门。本文的教程只是作为我在开发FKConsole的过程中的总结,并不会很全面。
FKConsole是我开发的一个用于在Xcode控制台显示中文的插件,很小,很简单。这个插件开发的初衷是因为一个朋友有这种需求,而又没有找到相应的插件。如果不使用插件,就要在工程中嵌入文件,他并不乐意。所以FKConsole在设计上只会去修改Xcode控制台内的文字显示,绝不会去修改你的文件,这点大家可以放心。
因为现在已经有很多人做Xcode插件开发了,所以插件模板这种东西也就应运而生了。
是一个Xcode插件开发的基本模板,可以使用直接安装,支持Xcode 6+。
安装完成之后,在创建工程的时候,会出现一个Xcode的插件的选项,这个就是Xcode中的插件工程模板。
模板会生成NSObject_Extension和你的工程名称一样的两个文件(.M)。
NSObject_Extension.m中的+(无效)pluginDidLoad:(*一个NSBundle)插件方法也是整个插件的入口。
一般来说,我们希望我们的插件是存活于整个Xcode的生命周期的,所以一般是一个单例,这个在另一个文件中会有体现。
这篇博文是记录FKConsole开发过程的,自然以此举例。
Xcode启动之后,会发出NSApplicationDidFinishLaunchingNotification的通知,模板上已经做了监听,我们在程序启动之后要在头部工具栏上加一个FKConsole的选项,以设置FKConsole插件的开关。
Mac软件开发和开发有一些不同,它使用的是AppKit的UI库,而不是UIKit,所以可能会感觉有些别扭。
NSApp表示中的[NSApp表示mainMenu]方法可以获取到头部的主按钮,里面会包含很有NSMenuItem,我们将在Xcode的Window选项之前插入一个Plugins选项(参考的做法),然后在这个选项中添加一个FKConsole的选项。(之所以添加一个Plugins选项是因为有些插件会添加到Edit中,有些会添加到View、Window中,我找半天都没找到选项在哪,还不如直接建一个Plugins选项,用户一眼就能知道插件在哪。)
NSMenu * MAINMENU = [NSApp表示MAINMENU]
我们需要一个状态来表示插件的开关,刚好NSMenuItem上有一个state可以表示状态,而刚好显示效果也不错,我们就用它了。
按钮添加完之后,我们现在需要获取到控制台的实例。很遗憾,苹果并没有给出文档。
很抱歉,我没有找到Mac软件开发上类似于Reveal的那种图层查看工具。喵神推荐了一个NSView的Dumping类,代码如下:
- (无效)dumpWithIndent :( 的NSString *)缩进{
的NSString *类= NSStringFromClass([ 个体经营类]);
的NSString *信息= @ && ;
如果([ 自 respondsToSelector:@selector(标题)]){
的NSString *标题= [ 自 performSelector:@selector(标题)];
如果(标题=!零 && [标题长度]& 0){
信息= [信息stringByAppendingFormat:@ &称号=%@& ,标题]
如果([ 自 respondsToSelector:@selector(stringValue的)]){
的NSString *字符串= [ 自 performSelector:@selector(stringValue的);
如果(字符串!= 零 && [字符串长度]& 0){
信息= [信息stringByAppendingFormat:@ &stringValue的=%@& ,字符串];
的NSString *提示= [ 自我工具提示];
如果(提示=!零 && [提示长度]& 0){
信息= [信息stringByAppendingFormat:@ &提示=%@& ,提示]。
的NSLog(@ &%@%@%@& ,缩进,类信息);
如果([ 自子视图]计数]& 0){
的NSString * subIndent = [ 的NSString stringWithFormat:@ &%@%@& ,缩进,([缩进长度] / 2)%2 == 0?@ &|&:@ &:& ];
为(*的NSView在[子视图自子视图]){
[子视图dumpWithIndent:subIndent];
效果类似于如下:
除了这种做法之外,我用的是,这是facebook开源的一个LLDB的命令行辅助调试的工具。里面包含有一个pviews命令,可以直接递归打印整个key窗口,效果如下:
导入私有API
我们在里面找到了一个叫做IDEConsoleTextView的类,这是在上图中看到的所有View中唯一包含Console这个关键字的,我们查看一下它的frame,确定控制台就是它。
苹果并没有给将这个IDEConsoleTextView放到AppKit中,它是一个私有类,我们现在想要修改它,那么就需要拿到它的头文件。
Github上上有很多转储出来的Xcode中header,大家可以看一下:。我们在header中找到了IDEConsoleTextView.h&,处于IDEKit中。
在头文件中可以看到,IDEConsoleTextView是继承自DVTCompletingTextView&-&&DVTTextView&-&NSTextView。NSTextView中保存文字内容使用的是NSTextStorage *textStorage,所以我们要修改的是IDEConsoleTextView的textStorage。但是我们在NSTextStorage的头文件中并没有找到具体文字保存的属性,那我们这就去找。
我们循环遍历所有的的NSView,找到IDEConsoleTextView,我们看一下它的信息:
我们没有找到它的textStorage属性,我们尝试在控制台中打一下:
它是有这个属性的,只是在调试区没有看到。
textStorage的代表中有两个方法,分别是:
// 发送 -Process内编辑固定属性之前。
代表们可以改变文字或属性。
- (无效) textStorage: (NSTextStorage *) textStorage willProcessEditing: (NSTextStorageEditActions) editedMask范围:(NSRange) editedRange changeInLength: (NSInteger的)增量NS_AVAILABLE (10 _11,7 _0) ;
//内发送正确-processEditing通知布局管理器前,
代表们可以改变属性。
- (无效) textStorage: (NSTextStorage *) textStorage didProcessEditing: (NSTextStorageEditActions) editedMask范围:(NSRange) editedRange changeInLength: (NSInteger的)增量NS_AVAILABLE (10 _11,7 _0) ;
textStorage中字符或者描述被修改之后,会触发这个代理,那我们实现一下这个代理方法:
自.fkConsoleTextView .textStorage .delegate = 自我 ;
- (无效)textStorage:(NSTextStorage *)textStorage
willProcessEditing:(NSTextStorageEditActions)editedMask
范围:( NSRange)editedRange
changeInLength :( NSInteger的)三角洲
OK,这次我们找到了,IDEConsoleTextView中有一个_contents属性,这是一个继承自NSMutableAttributedString的类,这个里面的mutableString保存文字,mutableAttributes保存对文字的描述。我们需要修改的就是这个mutableString属性。
我们在代理方法中使用valueForKeyPath:可以获取到mutableString属性,那么,现在我们将它进行转换。
FKConsole是用来调整控制台中文显示的,目的是将类似于这种的Unicode编码(&\U6d4b\U8bd5"&)修改为(&"测试啊"&)这种的正常显示。
我在。上找到一种解决办法代码类似于这样:
- (的NSString *)stringByReplaceUnicode :( 的NSString *)的字符串
的NSMutableString * convertedString = [字符串mutableCopy]
[convertedString replaceOccurrencesOfString:@ &\\ U& withString:@ &\\ U&选项:0范围:NSMakeRange(0,convertedString 。长度)];
CFStringRef变换= CFSTR( & 任意六角/ Java&的);
CFStringTransform((__桥CFMutableStringRef)convertedString,NULL,变换,YES);
返回 convertedS
我们使用的setValue:forKeyPath:的方式去修改mutableString属性。
运行,确实可以,但是有一些问题。
如果使用findView的方式去查找IDEConsoleTextView,然后去设置代理的话,那么,在什么时候去findView呢,如果这时候又新打开几个页面呢,这是不确定的。
修改后的文字长度和原先的不一样,哪怕修改了editedRange也没有用。这样的话,如果在控制台上输入文字或者调试命令,可能会崩溃,崩溃的主要原因是IDEConsoleTextView用_startLocationOfLastLine和_lastRemovableTextLocation这两个属性去控制文字起始位置和删除位置,在设置mutableString之后,由于长度不一,可能会发生字符串取值越界的问题,而NSTextStorage的代理中又是获取不到持有它的IDEConsoleTextView的。
针对第一个问题,我们可以使用通知的方式去解决。
参照喵神的博客,可以监听全部的通知,然后去查找哪个是你所需要的。
- (ID)的init {
如果(自 = [ 超级初始化]){
[ NSNotificationCenter defaultCenter]的addObserver:自我
选择:@选择(的NotificationListener :)
名称:无目标:零 ]
回归 自我 ;
- (无效)的NotificationListener :( NSNotification *)的NotI {
的NSLog(@ &通知:%@&,[NotI位名]);
我们这里只需要监听NSTextDidChangeNotification就行,然后在方法内去判断一下,之后再设置代理。
- (无效)textStorageDidChange:(NSNotification *)的NotI
如果([NotI位。对象 isKindOfClass:NSClassFromString(@&IDEConsoleTextView&)&&
((IDEConsoleTextView *)的NotI。对象).textStorage。委派!=个体经营)
(。(IDEConsoleTextView *)的NotI 对象)。.textStorage 委托 =自我;
这样就解决了第一个问题。
添加方法和手段的交叉混合
这里有兴趣的话,可以参考我另外一篇博客:,里面以举例的方式讲解了常见的运行时用法。
针对第二个问题,我采用的办法是在适当的时候去修改IDEConsoleTextView的_startLocationOfLastLine和_lastRemovableTextLocation属性。经实验,崩溃的方法主要是IDEConsoleTextView的这些方法:
- (void) insertText: (id)arg1;
- (void) insertNewline: (id)arg1;
- (void)clearConsoleI
- ( BOOL ) shouldChangeTextInRanges: (id)arg1 replacementStrings: (id)arg2;
我给IDEConsoleTextView在运行时添加了以下的方法:
- (void) fk_insertText: (id)arg1;
- (void) fk_insertNewline: (id)arg1;
- (void)fk_clearConsoleI
- ( BOOL ) fk_shouldChangeTextInRanges: (id)arg1 replacementStrings: (id)arg2;
之后,使用来交换,混合方法,类似于这样:
- (无效) addMethodWithNewMethod: (SEL) newMethod originMethod: (SEL) originMethod
方法targetMethod = class_getInstanceMethod (NSClassFromString(@ &IDEConsoleTextView& ),newMethod);
方法consoleMethod = class_getInstanceMethod (self.class,新方法) ;
IMP consoleIMP = method_getImplementation (控制台方法) ;
如果(!目标的方法)
class_addMethod (NSClassFromString(@ &IDEConsoleTextView& ),newMethod,consoleIMP,method_getTypeEncoding (控制台方法));
如果(原产地法)
NSError *错误;
[NSClassFromString (@ &IDEConsoleTextView& )
jr_swizzleMethod:newMethod
withMethod:originMethod
错误:错误]
的NSLog (@ &错误=%@& ,错误) ;
在fk_开头的系列方法中,添加了对IDEConsoleTextView的检查:
- (无效) fk_checkTextView: (IDEConsoleTextView *)的TextView
如果(文本查看的.text 存储。长度&[文本查看值ForKeyPath:克StartLocationOfLastLineKey ]长的longValue ])
[TextView中的setValue:@ (文本查看的.text 存储。长度) forKeyPath:kStartLocationOfLastLineKey];
如果(文本查看的.text 存储。长度&[文本查看值ForKeyPath:克LastRemovableTextLocationKey ]长的longValue ])
[TextView中的setValue:@ (文本查看的.text 存储。长度) forKeyPath:kLastRemovableTextLocationKey];
- (无效) fk_insertText:(ID) ARG1
[个体经营fk_checkTextView: (IDEConsoleTextView *)个体经营];
[个体经营fk_insertText:ARG1];
这样,就解决了第二个问题。
OK,FKConsole这就基本开发完成了。
上文也提到了,Alcatraz是一个开源的Xcode包管理器。事实上,Alcatraz也成为了我们目前安装Xcode插件的最主要的工具。
现在我们将FKConsole提交到恶魔上。
是Alcatraz的包仓库列表,packages.json保存了所有Alcatraz支持的插件、色彩主题、模板。
我们fork一下到中。之后,仿照这种格式,添加上我们的项目。
& 名 &:&FKConsole& ,
& url可 &:&/Forkong/FKConsole& ,
& 说明 &:&FKConsole是一个插件的Xcode调整控制台显示器(对中国)。& ,
& 屏幕截图 &:&/Forkong/FKConsole/master/Screenshots/demo.gif&
rspec是用ruby写的一个测试框架,这里作者写了一个用于测试你修改过后的packages.json是否合法的脚本。直接切到alcatraz-packages目录下,运行rspec命令即可。通过的话,会这样显示:
RSpec的使用红宝石的宝石就能直接装上。
校验没有问题之后,我们拉入请求,我们的提交就出现在的拉请求上了:
(大家千万不要像我一样,没看清除,直接添加到最后面了。它是有三个分类的,一定要看清楚,要添加到插件的分类上。)
阅读(...) 评论()Xcode7.3_KSImageNamed等插件安装后无效解决方法_山哥么么哒_新浪博客
Xcode7.3_KSImageNamed等插件安装后无效解决方法
前言:最近升级Xcode至7.3后,发现以前安装的插件无效了,重新下载打开后发现插件安装不了,没有反应。
解决办法如下:
1.先到git上下载最新的代码运行然后重启Xcode
## How do I use it?
Build the KSImageNamed target in the Xcode project and the
plug-in will automatically be installed in
`~/Library/Developer/Xcode/Plug-ins`. Relaunch Xcode and
`imageNamed:` will magically start autocompleting your
**Important**: Old versions of KSImageNamed were installed
in `~/Library/Developer/Application
Support/Developer/Shared/Xcode/Plug-ins`. Make sure to remove
`KSImageNamed.xcplugin` from there before installing the new
## How do I include file extensions when
autocompleting?
Enter the following command and relaunch
Xcode:`defaults write com.apple.dt.Xcode
KSShowExtensionInImageCompletion -bool YES`
以上是官方文档
在第一次安装的时候切记在跳出bundle选择的时候选择load,不然会安装失败,这样的话,解决方法如下:
官方文档中说安装地址在~/Library/Developer/Application
Support/Developer/Shared/Xcode/Plug-ins,但我的Mac是在~/Library/Developer/Xcode/Plug-ins(安装的时候选择的吧,给忘了),rm
那个KSImageNamed.xcplugin文档,然后命令行敲入`defaults
write com.apple.dt.Xcode KSShowExtensionInImageCompletion -bool
NO`注意是NO,让后重新安装就可以重新来过,别忘记load
打开Finder前往文件夹(Shift + Cmd +
G)​
如果曾经安装过,那么就先删除那个插件(过程如上),再`defaults write
com.apple.dt.Xcode KSShowExtensionInImageCompletion -bool
NO`,ok,重新来过
摘要&Xcode
升级到7之后VVDocumenter-Xcode,OMColorSense,KSImageNamed等一系列的插件失效的解决办法,以及不小心误点了
Skipbundle 的解决办法 Xcode
升级之后插件无法使用以及误点 Skipbundle
之后的解决办法&
小伙伴们在升级了 Xcode7
之后有些插件不能使用了.现在提供如下解决办法:
1. 首先查看 Xcode
的&UUID,在终端执行
defaults read /Applications/Xcode.app/Contents/Info
DVTPlugInCompatibilityUUID
会得到一串&UUID&码
2. 找到 Xcode
插件所在的目录
~/Library/Application
Support/Developer/Shared/Xcode/Plug-ins
选择已安装的插件如:VVDocumenter-Xcode,右键显示包内容,找到
info.plist
找到DVTPlugInCompatibilityUUIDs的项目,添加一个Item,Value的值为之前Xcode的UUID,保存.
重启 Xcode 之后会提示"Load
bundle"、 "Skip Bundle",这里必须选择"Load
bundle",不然插件无法使用。
3. 如果手误点击了"Skip
Bundle"的解决办法
找到该插件安装路径下,继续打开在 info.plist
删除与命令端里面同样的UUID号,一般都是会再最后一行,自己添加的那一行也要删除掉
保存之后重启Xcode
再次添加之前xcodeUUID。在重启就再次出现了插件提示
UIImage的imageNamed提供文件名自动补全功能。使用[UIImage
imageNamed:@"xxx"]时,该插件会扫描整个workspace中的图片文件。
若安装后无效,或许需要做一下修改:
1.打开xcode插件所在的目录:
~/library/Users/“你自己的用户名”/Library/Developer/Xcode/Plug-ins
2.选择已经安装的插件KSImageNamed,右键点击show
package contents(显示包内容),
3.找到info.plist
文件,找到DVTPlugInCompatibilityUUIDs的项目,
4.添加ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C(当前Xcode的UUID,
可在终端执行 defaults read
/Applications/Xcode.app/Contents/Info
DVTPlugInCompatibilityUUID 即可获取相应号码)
5.再右键“显示包内容”双击contents\MacOS目录下的一个黑色图标,会打开终端窗口,最后打印“进程已完成”之类,
6.重启xcode
另一种简洁的修改plist方法:
Xcode打开KSImageNamed.xcodeproj,修改KSImageNamed-Info.plist文件,找到DVTPlugInCompatibilityUUIDs的项目,添加ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C(当前Xcode的UUID,可在终端执行
defaults read /Applications/Xcode.app/Contents/Info
DVTPlugInCompatibilityUUID 即可获取相应号码)
运行项目后,重新打开Xcode,加载资源文件包即可!
参考:http://blog.csdn.net/jeffasd/article/details/
山哥么么哒
博客等级:
博客积分:0
博客访问:78,680
关注人气:0
荣誉徽章:&>&&>&&>&&>&FuzzyAutocompletePlugin-xcode自动补全插件
FuzzyAutocompletePlugin-xcode自动补全插件
上传大小:250KB
这个最的程序,主要是方便有些国内用户访问不流畅的做的一个下载,还有个插件太有用了。
使用方法也很简单,就是下载下来是mac上的xcode项目,编译一下就行了,然后你看你的插件目录看有这个插件没。一般重启一下机器就好了
综合评分:3.7(7位用户评分)
所需积分:0
下载次数:229
审核通过送C币
创建者:nigelyq
创建者:liuyujie0514
课程推荐相关知识库
上传者其他资源上传者专辑
移动开发热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
FuzzyAutocompletePlugin-xcode自动补全插件
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
tiantian1980
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:xcode更新后插件和代码提示失效 - 简书
xcode更新后插件和代码提示失效
3月22号,苹果发布了最新版的操作系统ios9.3,还有最新的xcode7.3,里面还集成了最新的swift2.2版本,所以今天在苹果商店更新到了xcode7.3,完成之后,问题来了
第一个问题:原来的插件都失效了,包括喜欢的全能代码提示插件在内。
第二个问题:在项目里引入自定义控制器的头文件,创建实例对象时代码提示没有了,需要自己分清大小写的去打出来
在遇到这两个问题时,一开始自己也是一头雾水,就百般搜索,问题解决了,那么我也记录和分享一下解决方法
先说第一个问题:解决插件失效的问题
1、打开终端
输入以下指令
defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
2、此时你会获得 DVTPlugInCompatibilityUUID
然后接着在终端输入以下指令,并将 add 后面的内容换成前面获得的DVTPlugInCompatibilityUUID
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add 9F7-4ADC-B558-F9CADF7073A7
这里写图片描述
3、重启xcode
,问题解决
接着解决第二个问题,代码提示失效
目前觉着这个方法稍微简单好理解,如下: 依次点击Xcode--&Window--&Projects, 接着选中你的项目,点击如下图中Derived Data右侧的Delete按钮
这里写图片描述
关闭工程,重启xcode,问题解决
但是后来发现,这个方法只能在每个工程里都这么操作一下,目前没有发现其他好的方法,如果后期发现,再来更新
当然,关于第二个问题的解决方法,在苹果论坛里早就有人发表过,我只是选了其中好操作的一点来说
原文地址:
另一篇大牛博客里也有详细方法介绍,给个链接
学到就是赚到
学习并记录,前进并成长.}

我要回帖

更多关于 xcode8.0代码自动补全 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信