zoukankan      html  css  js  c++  java
  • 【iOS

    由于懒癌,好久不更了,也是有一段时间没有遇到一些值得记录的问题,今天终于有空闲,就把这两个月遇到的问题总结一下。

    1.xcode11中,APPdelegate没有window属性,在运行一些需要使用window上属性的方法会崩溃。

    // 会有如下的错误提示
    -[AppDelegate setWindow:]: unrecognized selector sent to instance 
    
    // 解决方法
    在APPdelegate.h中添加下面代码
    @property (nonatomic, strong) UIWindow * window;
    

     2.xcode11中,IPA包上传太慢或者卡在authenticating with the app store

    上周我更新应用的时候,IPA上传不成功,上传了半小时一直卡在authenticating with the app store,最开始我以为是安装包有不合规的地方,就使用validate来进行校验。可是结果一切正常,显示successfully validated。这就很奇怪了。

    由于xcode11中已经没有了Application Loeader,也在App Store中提供了新的应用transporter来替代它上传,我也是下载了新的应用,可是仍然不成功。

    于是我接着在网上找解决方法。终于我找到了一个解决方案,亲测可行,分分钟就上传成功了。

    // 第一步 进入你的缓存文件夹  注意需要更改你的用户名
    cd /Users/用户名/Library/Caches
    // 第二步 删除缓存
    rm -rf com.apple.amp.itmstransporter
    // 第三步 执行命令
    /Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/itms/bin/iTMSTransporter
    
    补充:这个最后一步最好是FQ后使用,它是下载一些文件,国内下载比较慢

    参考:简书文章

    3.cocoapods的pod问题

    最新方法已经写到了之前发的博客中,请点击查看

     4. 查看iOS各系统的版本占比

    (1)苹果官网查询 (2)三方统计

    5.textfield的实时监听在中文输入法下的问题

    之前我也是仿照textview的方法写了一个监听textfield的实时输入的方法,但是有一个问题之前没有注意,最近发现了。那就是在中文输入法下,会出现未选择中文,还是拼音的情况下仍会继续进行下一步如搜索的功能。

    // 添加监听
    [_textField addTarget:self action:@selector(textFieldDidChange:)
    
    // 解决方案
    - (void)textFieldDidChange:(UITextField *)textField {
        
        if (textField.markedTextRange == nil) {
            NSLog(@"text:%@", textField.text);
            // 进行操作 ,在这里如果是中文输入法就不会出现搜索拼音的情况
        }
    }

     6.禁止输入emoji表情

    前几天在搜索功能实现中,我遇到了一个问题,就是在搜索时我输入了emoji表情,后台接口直接报错。这个一般都是后台来解决。然而后来我就想如果是APP来做处理应该怎么做。

    (1)第一种方法  这个可能会有遗漏

    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
        if ([self stringContainsEmoji:text]) {
            [textView resignFirstResponder];
            [MBProgressHUD showMessag:@"暂不支持输入表情符" toView:[UIApplication sharedApplication].keyWindow];
            return NO;
        }
        return YES;
    }
    
    //表情符号的判断
    - (BOOL)stringContainsEmoji:(NSString *)string {
    
        __block BOOL returnValue = NO;
    
        [string enumerateSubstringsInRange:NSMakeRange(0, [string length])
                                   options:NSStringEnumerationByComposedCharacterSequences
                                usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                    const unichar hs = [substring characterAtIndex:0];
                                    if (0xd800 <= hs && hs <= 0xdbff) {
                                        if (substring.length > 1) {
                                            const unichar ls = [substring characterAtIndex:1];
                                            const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                                            if (0x1d000 <= uc && uc <= 0x1f77f) {
                                                returnValue = YES;
                                            }
                                        }
                                    } else if (substring.length > 1) {
                                        const unichar ls = [substring characterAtIndex:1];
                                        if (ls == 0x20e3) {
                                            returnValue = YES;
                                        }
                                    } else {
                                        if (0x2100 <= hs && hs <= 0x27ff) {
                                            if (0x278b <= hs && hs <= 0x2792) {
                                                //自带九宫格拼音键盘
                                                returnValue = NO;;
                                            }else if (0x263b == hs) {
                                                returnValue = NO;;
                                            }else {
                                                returnValue = YES;
                                            }                                        
                                        } else if (0x2B05 <= hs && hs <= 0x2b07) {
                                            returnValue = YES;
                                        } else if (0x2934 <= hs && hs <= 0x2935) {
                                            returnValue = YES;
                                        } else if (0x3297 <= hs && hs <= 0x3299) {
                                            returnValue = YES;
                                        } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
                                            returnValue = YES;
                                        }
                                    }
                                }];
    
        return returnValue;
    }

    (2)第二种方法就是判断字符的字节长度  

    extension ViewController: UITextFieldDelegate {
        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            return !string.characterCodingOut
        }
    }
    
    extension String {
        var characterCodingOut: Bool {
            /* 遍历字符串的每一个字符 */
            for str in self {
                var byteCount = 0
                /* 计算字符串的编码字节长度 */
                /* UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。 */
                for _ in String(str).utf8 {
                    byteCount = byteCount + 1
                }
                /* 大于等于四个字节的禁止输入 */
                if byteCount >= 4 {
                    return true
                }
            }
            return false
        }
        
    }

     7.delegate的修饰

    好久没有使用过delegate了 ,昨天使用后发现有警告,后来才返现由于我写了多个方法,有几个不是必须实现的就没写,于是就报警告了。解决方法当然就是添加修饰符了,哪些是必需实现的(@required),哪些是可选的(@optional)

    8.删除scenedelegate

    这个文件是xcode11中新加的类,一般来说我们不需要他,可以不管,但是我前几天发现了一个问题,我正常使用SVProgressHUD。结果发现弹窗显示在了左上角,不注意根本不会发现。我找了好多原因没发现。后来突发奇想把scenedelegate删除,结果就好了。这个问题的原因暂未找到。

    删除这个文件的方法如下
    1、删除Scenedelegate的.h.m文件
    2、删除Info.plist文件中的Application Scene Manifest配置
    3、删除AppDelegate.m文件中的两个管理Scenedelegate生命周期代理方法
    4、在AppDelegate.h中,添加window属性
  • 相关阅读:
    dubbo接口测试
    httpclient接口返回结果中文显示问号
    idea创建springboot项目报错Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings.
    前端框架angular
    测试思考
    sonar的使用
    IDEA中getter方法报红
    dubbo相关
    IDEA无法从mapper方法直接点进xml文件的解决办法
    java笔记-spring boot系列
  • 原文地址:https://www.cnblogs.com/weicyNo-1/p/12552248.html
Copyright © 2011-2022 走看看