一、使用方式
+ 如下代码块功能:判断字体,判断字体输入格式
 
    NSString *firstStr = [name substringToIndex:1];
    NSArray *num = @[@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];
    if ([num containsObject:firstStr]) {
        [self warnUser:@"昵称不能以数字开头"];
        return;
    }
   
    if ([name containsStringAvailable:@" "]) {
        [self warnUser:@"昵称不可以包含空格"];
        return;
    }
   
    if ([StringUtil stringContainsEmoji:name]) {
        [self warnUser:@"昵称不可以包含表情等特殊字符"];
        return;
    }
   
    if ([StringUtil lengthByUTF8:name] > 24) {
        [self warnUser:@"昵称过长, 汉字最多8个, 英文最多24个"];
        return;
    }
 
 
+ containsStringAvailable() 方法:用来判断是否包含此字符
 
- (BOOL)containsStringAvailable:(NSString *)other
{
    if ([selfisIOS8AndLater]) {
        return [self containsString:other];
    }
    else {
        NSRange range = [self rangeOfString:other];
        return range.length != 0;
    }
}
 
- (BOOL)isIOS8AndLater
{
    return [[[UIDevicecurrentDevice] systemVersion] floatValue] >= 8.0;
}
+ stringContainsEmoji() 方法:用来判断是否包含表情字符
+ (BOOL)stringContainsEmoji:(NSString *)string
{
    __blockBOOL returnValue = NO;
   
    NSRange range = NSMakeRange(0, [string length]);
    [string enumerateSubstringsInRange:range options:NSStringEnumerationByComposedCharacterSequencesusingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        constunichar high = [substring characterAtIndex: 0];
       
        // Surrogate pair (U+1D000-1F9FF)
        if (0xD800 <= high && high <= 0xDBFF) {
            constunichar low = [substring characterAtIndex: 1];
            constint codepoint = ((high - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
           
            if (0x1D000 <= codepoint && codepoint <= 0x1F9FF){
                returnValue = YES;
            }
        }
        // Not surrogate pair (U+2100-27BF)
        else {
            if (0x2100 <= high && high <= 0x27BF){
                returnValue = YES;
            }
        }
    }];
    return returnValue;
}
+ lengthByUTF8() 方法:用来判断 UTF-8 字符长度(一个汉字 = 3个 UTF-8 字符)
 
+ (int)lengthByUTF8:(NSString *)str
{
    int strlength = 0;
    char *p = (char *)[str cStringUsingEncoding:NSUTF8StringEncoding];
    for (int i=0; i<[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; i++) {
        if (*p) {
            p++;
            strlength++;
        }
        else {
            p++;
        }
    }
   
    return strlength;
}
 
二、我的想法
 
明天要出个String 的工具类出来,分别讲解一下string需要的方法,今天在判断UTF-8字符长度的时候,判断错了,把一个汉字作为两个长度处理了,导致测试测出Bug,这些小问题一定要自我验证,不能到测试那里才出现这种问题。
 
 
三、思考与行动
 
1.如何通过一个方法来判断汉字最多10个,英文最多5个?
 
2.判断是否包含表情字符的方法,我设计的合理么?是否会存在一些问题?你有没有更简洁的方法?
 
 
 
 
 
 
 
 
 
 
 

<iOS小技巧> 昵称格式判断的更多相关文章

  1. iOS小技巧总结,绝对有你想要的

    原文链接 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIV ...

  2. 总有你需要的之 ios 小技巧 (下)

    图片上绘制文字 写一个UIImage的category NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultPara ...

  3. 你想要的iOS 小技巧总结

    UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(, , ...

  4. iOS小技巧 - 和屏幕等宽的Table分割线

    前言 因为本人也是学习iOS才一个多月,在写程序的过程中经常会遇到一些看似应该很简单,但是要解决好却要知道一点小trick的问题. 因此后面会陆续记一些这类问题,一来加深印象,二来也可以做个备忘录. ...

  5. iOS小技巧:用runtime 解决UIButton 重复点击问题

    http://www.cocoachina.com/ios/20150911/13260.html 作者:uxyheaven 授权本站转载. 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的 ...

  6. iOS小技巧3

    将颜色合成图片 将颜色合成图片 +(UIImage *)imageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0.0f, 1 ...

  7. iOS小技巧2

    这段代码是实现了类似QQ空间"我的空间"里面的圆形头像 //圆形的头像 UIImageView * headImage = [[UIImageView alloc]initWith ...

  8. iOS小技巧

    键盘透明: textField.keyboardAppearance = UIKeyboardAppearanceAlert; 状态栏的网络活动风火轮是否旋转: [UIApplication shar ...

  9. 【小技巧】C#判断电脑是否联网

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

随机推荐

  1. Node.js,一生所爱

    下午参加了<云品秀--前端前沿>,用友云平台前端架构师郭永峰(站着的那位)讲得很棒,而我最关注的就是Node了.最后我问了他关于独立开发,后端选择Node还是别的语言.他讲了很多,说自己在 ...

  2. Android studio怎么创建Android虚拟机?

    进行Android studio中进行开发app应用的情况,如果在进行调式app的应用的情况下,没有真机手机机器是没有办法调式的,那么只能通过Android studio中sdk提供虚拟机进行调式ap ...

  3. Spring4+Springmvc+quartz实现多线程动态定时调度

    scheduler定时调度系统是大多行业项目都需要的,传统的spring-job模式,个人感觉已经out了,因为存在很多的问题,特别是定时调度的追加.修改.删除等,需要修改xml,xml的配置生效无非 ...

  4. Arcgis api for javascript学习笔记(4.5版本) - 点击多边形(Polygon)并高亮显示

    在现在的 arcgis_js_v45_api 版本中并没有直接提供点击Polygon对象高亮显示.需要实现如下几个步骤: 1.点击地图时,获取Polygon的Graphic对象: 2.对获取到的Gra ...

  5. WPF 导出资源文件

    在wpf开发中我们可以把各种文件.图片打包到项目中也就是应用程序资源文件,然后在项目中可以通过特定的uri格式去调用.那有些时候为了方便我们可能想要在程序中将资源文件导出来使用,那么怎么做呢? 第 1 ...

  6. .net 模拟发起HTTP请求(用于上传文件)

    用C#在服务端发起http请求,附上代码一 /// <summary> /// 文件帮助类 /// </summary> public class FileHelper { / ...

  7. 在Android程序中使用Modbus协议时报 java.net.SocketException: recvfrom failed: ECONNRESET解决办法

    最近在开发基本Modbus协议的Android端PLC控制程序,C#版程序没有任何问题,移到JAVA下出现各种问题,其中比较苦恼的是java.net.SocketException: recvfrom ...

  8. windows 7 SDK和DDK下载

    检查小数据,获取地址.顺便记录下来. Windows Driver Kit Version 7.1.0 http://www.microsoft.com/downloads/details.aspx? ...

  9. JQUERY名称冲突

    jQuery 使用 $ 作为符号 jQuery 介绍的简单方法. 其他 JavaScript 库函数(例 Prototype)使用相同的 $ 符号. jQuery 使用命名 noConflict() ...

  10. Ubuntu 15.04 clang++ 3.6 编译boost 1.59/1.55

    Ubuntu 15.04已经可以直接通过apt-get insall 安装clang 3.6, 并且预装的gcc版本是4.9.2.这些安装过程在这里介绍. 首先下载boost源码 wget -O bo ...