1、编译出现errSecInternalComponent
第一个出现的报错是有SWIFT_VERSION关键字的,之后通过添加SWIFT_VERSION以及对应版本号就解决了。
看Xcode报错内容,一直说是某个库签名失败,就有点不解了,其他库都可以签名正确,怎么就偏偏这个库签名失败,听误导人的。很容易就陷进去研究这个库究竟有没有导入正确。
查了文章,说是Provision profile的问题,刚好这台电脑是之前一位同事用的,我去到目录~/Library/MobileDevice/Provisioning Profiles
,将一些过期的profile文件删除了,然后重启电脑,就可以了。不重启电脑还是会报错的。
顺便还清理了/Users/denny/Library/Developer/Xcode/DerivedData/
所有问题都解决之后,发现运行起来会崩溃,报错
dyld: Library not loaded: @rpath/libswiftCore.dylib
奇怪了,这个问题一般是动态库没有加载才报错的。而这个库我是pod进来的,按道理来说,应该自动处理了动态库的加载才对,不需要手动在Embed中添加。
排查了很久也没有用,最终,是同事帮忙,发现原因是Xcode中
TARGETS -> Build Phases -> Copy Pods Resources,打了勾,这个打钩是排查前两个问题的时候打的,最后也没有取消掉,才导致此动态库加载错误的问题。
2、信号量
使用的代码记录一下,否则总是忘记
dispatch_semaphore_create(long value); // 创建信号量
dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); // 等待信号量
dispatch_semaphore_signal(dispatch_semaphore_t deem); // 释放信号量
记住:
(1)等待 和 释放,是要对等的
(2)要用全局变量持有信号量对象
3、UIImageView加载连续帧动画
NSMutableArray * imgArr = [NSMutableArray array];
for (int i = 1; i <= 60; i++) {
NSString * imgName = [NSString stringWithFormat:@"sound00%02d.png",i];
UIImage * img = [self playerSkinImage:imgName];
if (img != nil) {
[imgArr addObject:img];
}
}
self.imgArr = imgArr;
self.animationImgV.animationImages = imgArr;
self.animationImgV.animationDuration = 3.5;
[self.animationImgV startAnimating];
有一个问题就是,因为我需要加载60张图片,所以这个过程很耗时,因为我放在异步线程去加载,加载完了再回到主线程。这样主线程就不会被卡住了。
4、格式化打印
// 补0,比如007
[NSString stringWithFormat:@"%02d",hour];
// 保留小数位
[NSString stringWithFormat:@"%.2f",hour];
5、输入框添加左边距、右边距
_textF.leftView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 16, 0)];
_textF.leftViewMode = UITextFieldViewModeAlways;
_textF.rightView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 16, 0)];
_textF.rightViewMode = UITextFieldViewModeAlways;
修改光标颜色
_textF.tintColor = [UIColor whiteColor];
6、监听输入框字符变化
[_textF addTarget:self action:@selector(textFieldDidChange) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChange{
NSString *toBeString = _textF.text;
//获取高亮部分
UITextRange *selectedRange = [_textF markedTextRange];
UITextPosition *position = [_textF positionFromPosition:selectedRange.start offset:0];
//没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position){
if (toBeString.length > MAX_STARWORDS_LENGTH){
NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:MAX_STARWORDS_LENGTH];
if (rangeIndex.length == 1){
_textF.text = [toBeString substringToIndex:MAX_STARWORDS_LENGTH];
}else{
NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, MAX_STARWORDS_LENGTH)];
_textF.text = [toBeString substringWithRange:rangeRange];
}
}
}
}
7、iOS系统实际上也有提供一些图标给开发者使用,只是一般不关注并且很少合适使用。参考文章 iOS 系统和自定义图标规格
还有个疑问需要验证下,tabBar不知道是否可以通过tintColor来直接修改图标颜色。而不需要重新出图标。
8、webview监听网页内点击跳转
// 遵循协议
webView.delegate=self;
// 实现方法
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// 获取到即将要跳转的链接地址
NSString *url=request.URL.absoluteString;
// 判断是否符合
if ([url isEqualToString:xxx]) {
return NO;
}
return YES;
}
其中,navigationType可以让你得知这个跳转的来源是什么,比如是用户点击网页内而出发的跳转的,还是直接代码调用调用触发的跳转。
UIWebViewNavigationTypeLinkClicked,用户触击了一个链接。
UIWebViewNavigationTypeFormSubmitted,用户提交了一个表单。
UIWebViewNavigationTypeBackForward,用户触击前进或返回按钮。
UIWebViewNavigationTypeReload,用户触击重新加载的按钮。
UIWebViewNavigationTypeFormResubmitted,用户重复提交表单
UIWebViewNavigationTypeOther,发生其它行为。
还有一种方式我没怎么试,先记录下来
[_webView addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{
NSLog(@"url == %@",self.webView.URL.absoluteString);
}
9、突然想起,貌似可通过event来判断button的点击事件是否是由用户触发的,还是代码调用触发的。可试一下。
网友评论