问题描述:Xcode9之后如何拖拽选中文字之后拖拽代码?
解决办法:点击选中的代码(文字),不要移动和松开鼠标左键,三秒钟之后,当竖线变成箭头之后就可以拖动了。
一:初识代码块
比如最常见的定义属性:
@property (nonatomic, strong) <#type#> *<#value#>
// 备注:<##> 作用是占位,## 之间可以输入提示文字。
代码块在哪个地方:
双击编辑其中的某一个代码块(代码块就是{}中的):
每个标题的含义为:
Title:标题。
Summary:描述文字。
Platform:可以使用的平台(如iOS)。
Language:可以在哪些语言中使用(如 Objective-C)。
Completion Shortcut:快捷方式,以字母开头(支持少数符号,如@)。
Completion Scopes:作用范围,一般写在正确的位置拖动即可,Xcode会自行选择好。
备注:
1.1 点击Edit对代码片段进行编辑
1.2 点击Done对代码片段完成编辑
1.3 选中某一行代码片段,点键盘击Delete即可删掉
二:常用代码片段
1.注释(属性注释)
Completion Shortcut: @explain property - 属性注释
Completion Scopes: Class Implementation
/** <#注释#> */
2.注释(方法内部注释)
Completion Shortcut: @explain single - 函数内部注释
Completion Scopes: Class Implementation
// --<#说明#>
3.注释(函数mark注释)
Completion Shortcut: @explain mark - 函数mark注释
Completion Scopes: Class Implementation
#pragma mark <#mark#>
4.GCD:主线程
Completion Shortcut: @gcdmain
Completion Scopes: Function or Method
dispatch_async(dispatch_get_main_queue(), ^{
<#code#>
});
5.待处理事项
Completion Shortcut: @warning
Completion Scopes: Function or Method
#warning todo <#message#>
5.GCD:异步
Completion Shortcut: @gcdglobal
Completion Scopes: Function or Method
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
<#code#>
});
6.静态字符串
Completion Shortcut: @staticstring
Completion Scopes: Top Level
static NSString* const <#name#> = <#value#>;
5.静态整形
Completion Shortcut: @staticint
Completion Scopes: Top Level
static const NSInteger <#name#> = <#value#>;
6.输入函数
Completion Shortcut: @log
Completion Scopes: Function or Method
NSLog(@"<#Log#>");
7.若引用
Completion Shortcut: @weakself
Completion Scopes: Function or Method
__weak typeof(self) weakSelf = self;
8.强引用
Completion Shortcut: @strongSelf
Completion Scopes: Function or Method
__strong typeof(<#weakSelf#>) strongSelf = <#weakSelf#>;
9.单例类
Completion Shortcut: @instance
Completion Scopes: Class Implementation
+ (instancetype)sharedInstance
{
static id _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
10.初始化tableView
Completion Shortcut: @tableinit
Completion Scopes: Function or Method
- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;
}
return _tableView;
}
11.tableView代理和数据源方法
Completion Shortcut: @tableDelegate
Completion Scopes: Class Implementation`
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return <#count#>;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
<#classCell#> *cell = [tableView dequeueReusableCellWithIdentifier:<#kReuseIdentifier#> forIndexPath:indexPath];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return <#rowHeight#>;
}
12.初始化button
Completion Shortcut: @buttoninit
Completion Scopes: Function or Method
UIButton *button = [[UIButton alloc] init];
button.backgroundColor = [UIColor <#backgroundColor#>];
button.titleLabel.font = [UIFont <#font#>];
[button setTitle:<#title#> forState:UIControlStateNormal];
[button setTitleColor:[UIColor <#titleColor#>] forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[<#view#> addSubview:button];
13.初始化边线button
Completion Shortcut: @borderbutton
Completion Scopes: Function or Method
UIButton *borderButton = [[UIButton alloc] init];
borderButton.layer.borderColor = [UIColor <#color#>].CGColor;
borderButton.layer.borderWidth = <#borderWidth#>;
borderButton.titleLabel.font = [UIFont <#font#>];
borderButton.clipsToBounds = YES;
borderButton.layer.cornerRadius = <#cornerRadius#>;
borderButton.backgroundColor = [UIColor <#backgroundColor#>];
[borderButton setTitleColor:[UIColor <#titleColor#>] forState:UIControlStateNormal];
[borderButton setTitle:<#title#> forState:UIControlStateNormal];
[borderButton addTarget:self action:@selector(borderButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[<#code#> addSubview:borderButton];
14.初始化label
Completion Shortcut: @labelinit
Completion Scopes: Function or Method
UILabel *label = [[UILabel alloc] init];
label.font = [UIFont <#font#>];
label.text = <#text#>
label.textColor = [UIColor <#textColor#>];
label.textAlignment = NSTextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
[<#view#> addSubview:label];
15.初始化可变label
Completion Shortcut: @attributedLabel
Completion Scopes: Function or Method
UILabel *attributedLabel =[[UILabel alloc] init];
attributedLabel.numberOfLines = 0;
attributedLabel.preferredMaxLayoutWidth = <#preferredMaxLayoutWidth#>;
attributedLabel.backgroundColor = [UIColor clearColor];
NSString *text = <#text#>;
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
style.lineSpacing = <#lineSpacing#>;
NSDictionary *attr = @{
NSFontAttributeName: [UIFont <#font#>],
NSParagraphStyleAttributeName: style,
NSForegroundColorAttributeName: [UIColor <#color#>]
};
attributedLabel.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attr];
[<#view#> addSubview:attributedLabel];
三:Git管理
Xcode中的代码片段默认放在下面的目录中:
~/Library/Developer/Xcode/UserData/CodeSnippets
四:同步代码片段
上述目录设置成一个 Git 的版本库,将代码片段放到 Github 上。(备注:还未尝试)
git clone [email protected]:SilenceLee17/xcode_tool.git
cd xcode_tool
./setup_snippets.sh
五:扩展
系统自带的有一些代码片段,我们能不能修改?当然可以啦。
Xcode内置代码片段目录
/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/SystemCodeSnippets.codesnippets
注意:Xcode5.1之前是在这个目录下
/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/? SystemCodeSnippets.codesnippets
六:SystemCodeSnippets.codesnippets浅析
该文件为plist格式xml文件描述文件。
IDECodeSnippetContents为代码片段的内容,修改即可达到目的。 IDECodeSnippetIdentifier唯一标示,重名即会覆盖。 IDECodeSnippetCompletionPrefix类似Completion Shortcut,键值留空可屏蔽该片段。
七:Tips
自定义目录不能有相同标识符的模板,否则Xcode启动后会崩溃。
自定义母的模板标识符可以跟系统默认模板标识符相同,可以达到覆盖效果。
若要使用自定义模板覆盖系统模板,则必须有DECodeSnippetUserSnippet字段,定义为true,否则Xcode启动后会崩溃。