荷月二十四 iOS小记 【编译报错/ImgV连续帧动画/输入框/webview监听】

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的点击事件是否是由用户触发的,还是代码调用触发的。可试一下。

你可能感兴趣的:(荷月二十四 iOS小记 【编译报错/ImgV连续帧动画/输入框/webview监听】)