• iOS-BaseConfig-工程基础配置


    Xcode Workspace就如同工厂, Xcode Project如同车间,每个车间可以独立于工厂来生产产品( project可独立于 workspace存在),但是各个车间组合起来就需要工厂来组织(如果用了 cocopods,就需要用 workspace)。 Xcode Target是一条条的流水线,一条流水线上面只生产一种产品。 Build Settings是生产产品的秘方,如果是生产汽水, Build settings就是其中各个原料的配方。 Xcode scheme是生产方案,包含了流水线生产,秘方,还包含生产完成之后的质检(test)

    1> iOS 真机测试包路径:

    点击->前往->前往文件夹 : /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

    2> 超级头文件Pch 配置Build Settings ->prefix header :$(SRCROOT)/工程名/类名

    3>Bitcode设置:

    Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allowApple to re-optimize your app binary in the future without the need to submit anew version of your app to the store.

    说的是bitcode是被编译程序的一种中间形式的代码。包含bitcode配置的程序将会在App store上被编译和链接。bitcode允许苹果在后期重新优化程序的二进制文件,而不需要重新提交一个新的版本到App store上。

    bitcode选项默认是设置为YES的。我们可以在”Build Settings”->”Enable Bitcode”->设置为No

     

    Other Linker Flags设置

    unrecognized selector sent to class 0x117e7c858 类扩展的坑

    错误原因:Other Linker Flags 链接设置错误导致类扩展不知道如何正确读取,找不到类方法而产生的错误。

    发证这个Bug的原因主要是因为写了扩展类之后没有在TATGETS->Build Settings->Other Linker Flags 里边添加正确的链接或者根本没添加链接,一般而言,如果是自己在项目中写扩展类,运行时都会自动添加的,如果这种情况实在是出了问题,那就自个儿在Xcode左边文件目录栏把对应的扩展方法文件拖进Other Linker Flags里边,它会自动生成链接的,绝对比你自己写的地址准确。但是如果是接入的静态库或者动态库,你就没有办法了,所以这个时候需要在Other Linker Flags后边添加"-all_load"、"-ObjC"、“-force _load”

    关于这三个的使用场景,因为我自己使用"-all_load"后问题就解决了,所以我觉得我的这个问题可能不足以测试出这三者的区别

    https://www.jianshu.com/p/7579eda7cbef

    4>微信支付处理和友盟库冲突

    //点击工程->Build Settings -> Library Search Paths 删除不引用的库 解决冲突

    5.XCode环境变量及路径设置

    一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径的缺点立马出现。

    所以在修改User Header Search Paths这个选项的时候使用"$(SRCROOT)/当前工程名字/需要包含头文件所在文件夹"

    将上面的双引号里面的字符串拷贝之后,你会发现这个“$(SRCROOT)”,会自动变成当前工程下的目录。这样就可以了,发给别人,别人也不用在去修改路径了。

    $(SRCROOT)/include/**表示根目录include目录下所有头文件

     

    6.userInteractionEnabled属性:设置为NO,在其下面的层级不会受影响,再其上面的控件、按钮无法点击;设置为YES,则可以点击。

    例如:bgScrollView在视图最底层,上面加的是bgView, shadowView先添加在bgView, UIButton后添加在bgView上,此时按钮可以点击。

     

    7.代码块添加方式

    注释语法格式:<#代码块内容#> 

    尖括号—两个#号—中间是可添加的注释 

     8.导航条字体样式设置

    //  1.设置左右两个Baritem 的字体颜色
    self.navigationController.navigationBar.tintColor = [UIColor redColor];
    // 2.设置标题字体大小和文本颜色
        [self.navigationController.navigationBar setTitleTextAttributes:
      @{NSFontAttributeName:[UIFont systemFontOfSize:19],
        NSForegroundColorAttributeName:[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]}];
    //  3.设置导航条的背景颜色
    self.navigationController.navigationBar.barTintColor = [UIColor blueColor];

    9.第一次进入某个页面设置键盘弹出

    [self performSelector:@selector(showKeyboard) withObject:nil afterDelay:0];
    
    - (void)showKeyboard
    {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [_inputTopic becomeFirstResponder];
        });
    }

    10.交换两个按钮的位置

        CGRect rect;
        rect = button.frame;
        button.frame = button01.frame;
        button01.frame = rect;

    11.字符串Url汉字转化

        NSString * str = @"下午上课了";
    //    [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    12.给应用添加自定义字体

    //1.找到系统的字体册,ShowInFinder一下,找到自己想要的字体,拖入到工程中去()
    //2.在Info.plist文件中添加Key值
    Information Property List->Fonts provided by application->item0 string->双击添加(XingKai.ttc)WawaSC-Regular.otf
    //3.在ViewDidLoad里面遍历输出FamilyName
    for (NSString * str in [UIFont familyNames]) {
            NSLog(@"%@",str);
        }
    //4.使用
    A label 设置字体
    label.font = [UIFont fontWithName:@“XingKai SC” size:30];
    A label 设置字体粗细
    label.font = [UIFont boldSystemFontOfsize:30];
    B Button 设置字体
    button.titleLabl.font = [UIFont fontWithName:@“XingKai SC” size:30];

    13.延时调用的方法是什么?如何取消延时调用?

    //触发延时调用
    
    self performSelector:
    
    [self performSelector:@selector(smallQianHeAnimation) withObject:nil afterDelay:3];
    
     
    //延时调用取消 
    
    NSObject  cancelPreviousPerformRequestsWithTarget
    
    [NSObject  cancelPreviousPerformRequestsWithTarget:self selector:@selector(smallQianHeAnimation) object:nil];

    14.两个App跳转

    应用程序之间的跳转(AppOne-AppTwo)
    AppOne配置
    第一.gotoAppTwo按钮的点击事件
    //应用程序之间的跳转 (在AppTwo添加key值
    info.plist—>URL types—>URL Schemes—->item0—>在后面空白处添加string—AppTwo可以随便写,但是你要记得住,一般写你的这个工程的名字))
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"AppTwo://?name=bb&psw=789&URL=AppOne"]]; 
    第二.AppTwo界面配置
    //1.在入口类方法AppDelegate.m中.
    
        //1.URLKey:NSURL:          要跳转的那个应用程序的URL
        //2.SourceApplicationKey: 跳过来的那个应用程序的名字
    //2.用提示框显示出来
    UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"tips" message:[NSString stringWithFormat:@"%@",launchOptions] delegate:nil cancelButtonTitle:@"知道了!" otherButtonTitles:nil, nil];
    [alertView show];
    //3.设置让通知延迟调用  
     [self performSelector:@selector(post:) withObject:launchOptions afterDelay:1];
    //4.发送通知
    - (void)post:(NSDictionary *)dic{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"getdata" object:dic];
    //5.ViewController.m中接收通知
    @property(nonatomic,copy)NSString * getUrl;
    接收通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getData:) name:@"getdata" object:nil];
    
    - (void)getData:(NSNotification *)noti{
    //1.用字典来接收object这个对象
        NSDictionary * dic = noti.object;
    //2.从字典中取出 要跳转的那个应用程序的URL
        NSURL * url = dic[UIApplicationLaunchOptionsURLKey];
    //3.//将URL转化为字符串
        NSString * urlStr = url.absoluteString;
    //4.用? 把字符串分割  
        NSArray * urlArr = [urlStr componentsSeparatedByString:@"?"];
    //5.取出问号之后的内容
        NSString * str1 = [urlArr lastObject];
    //6.用&分割
        NSArray * dataArr = [str1 componentsSeparatedByString:@"&"];
    //7.取出firstObject  name=bb
        NSString * nameStr = [dataArr firstObject];
    //8.用=分割
        NSArray * tempArr = [nameStr componentsSeparatedByString:@"="];
    //9.取出Lastobject - bb
        _showLabel.text = [tempArr lastObject];
        
    //10.   设置返回键 (首先在AppOne 设置key值) 并在URL后面拼接
    info.plist—>URL types—>URL Schemes—->item0—>在后面空白处添加string—AppOne
        NSString * dataUrl = [dataArr lastObject];
        self.getUrl = [[dataUrl componentsSeparatedByString:@"="] lastObject];
    //11.显示在弹出框里面    
            UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:urlStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertView show];//让弹出框显示出来
    //    让字符串显示在label上 
    }
    //返回按钮的点击事件
    //设置成通用的按钮,在后面的URL里面拼接URL=&AppOne
    - (IBAction)backButtonClick:(UIButton *)sender {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://",self.getUrl]]];
    }

    15.tag作用

    一、for循环中 tag值 的作用
    tag:标签。UI控件的一个属性,可以用来区分控件,找控件
    ①tag值相当于给控件添加一个编号,用来区分控件 多个按钮绑定同一个点击事件 用来区分点击的是哪个按钮
    ②(找控件)
    点击同一个按钮呈现不同的点击事件
    区分控件
    
    二、找控件
    ①多个按钮绑定同一个点击事件 如何区分点击的是哪个按钮(找不同) 
    ②点击同一个按钮,呈现不同的点击事件  
    ③找控件 View                                                                                                            

    16.基本类型转换

    //布尔类型转字符串
      BOOL  change;
      [NSString stringWithFormat:@"%d",change];
    
       //字符串 转化成 基本类型
       // 字符串 转化成 基本类型
        int  userAnswer = [textField.text  intValue];
       // 将基本类型转化成字符串类型-->字符串拼接
        NSString  *name = [NSString   stringWithFormat:@"%d.jpg",count%4];
        backImageView.image = [UIImage imageNamed:name];
       //1.把 字符串 转化成 基本类型
        int userAnswer = [textField.text intValue];
       //2.把 字符串 转化成 浮点型
        float userAnswer = [textField.text floatValue];
       //3.把 整型 转化成 字符型
      NSString *userAnswer = [NSString stringWithFormat:@“%d.jpg”,i];
      //4.把 浮点型 转化成 字符型
       NSString *userAnswer =   [NSString stringWithFormat:@“%f.jpg”,i];
      //5.字符串转化为具体的类
    if(sender.tag>arr. count)return;
    NSString * className = arr[sender.tag];
    将取出来的类的名字,根据名字转化成具体的类
    Class class = NSClassFromString(className);
    //6.将Data数据转化为字符串(NSUTF8StringEncoding)
    NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

     17.NSMutableAttributedString 设置居中

        //需要点击的字符不同
        NSString *label_text2 = @"和彩印用户服务协议与隐私政策";
        NSMutableAttributedString *attributedString2 = [[NSMutableAttributedString alloc]initWithString:label_text2];
        [attributedString2 addAttribute:NSFontAttributeName value:kBoldFont(26*gScale) range:NSMakeRange(0, label_text2.length)];
        [attributedString2 addAttribute:NSForegroundColorAttributeName value:XBHexString(@"#459bff") range:NSMakeRange(0, 9)];
        [attributedString2 addAttribute:NSForegroundColorAttributeName value:ALLOCCOLOR(0xff9B9B9B) range:NSMakeRange(9, 1)];
        [attributedString2 addAttribute:NSForegroundColorAttributeName value:XBHexString(@"#459bff") range:NSMakeRange(10, 4)];
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = NSTextAlignmentCenter;// 设置文字居中
        [attributedString2 addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [label_text2 length])];
        protocolLbl.numberOfLines = 2;
        protocolLbl.attributedText = attributedString2;
        [protocolLbl tapActionWithBlcokStrings:@[@"和彩印用户服务协议",@"隐私政策"] tapClicked:^(NSString *string, NSRange range, NSInteger index) {
    //        NSString *message = [NSString stringWithFormat:@"点击了“%@”字符
    range: %@
    index: %ld",string,NSStringFromRange(range),index];
    //        [HKMessageBox showMessage:message];
            if ([string isEqualToString:@"和彩印用户服务协议"]) {
                XBProtocolViewController * vc = [[XBProtocolViewController alloc] init];
                [self.navigationController pushViewController:vc animated:YES];
            }else if ([string isEqualToString:@"隐私政策"]) {
                XBPrivacyViewController * vc = [[XBPrivacyViewController alloc] init];
                [self.navigationController pushViewController:vc animated:YES];
            }
        }];

    Xcode隐藏ToolBar之后怎么让它再次显示出来:双击工程--showToolBar

    18.枚举简单定义

    typedef enum {
        /** 全部 */
        HKTopicTypeAll = 1,
        /** 图片 */
        HKTopicTypePicture = 10,
        /** 段子 */
        HKTopicTypeWord = 29,
        /** 声音 */
        HKTopicTypeVoice = 31,
        /** 视频 */
        HKTopicTypeVideo = 41
    } HKTopicType;
    
    typedef NS_ENUM(NSUInteger, HKTopicType) {
       /** 全部 */
       HKTopicTypeAll = 1,
       /** 图片 */
       HKTopicTypePicture = 10,
       /** 段子 */
       HKTopicTypeWord = 29,
       /** 声音 */
       HKTopicTypeVoice = 31,
       /** 视频 */
       HKTopicTypeVideo = 41
    };

    19.修改网页字体大小和背景颜色

    //document.getElementsByTagName('img');
    //document.getElementById('jsParamFuncSpan').innerHTML
    //document.getElementsByTagName('body')[0].outerHTML
    //document.getElementsByClassName('标签的类名')
    //document.getElementsByClassName('adpic')[0].style
    //document.getElementsByTagName('img')[0].src
    //document.getElementsByTagName('img')[0].src
    //document.getElementsByTagName('img')[0].src='http://findicons.com/files/icons/132/software_files/512/png.png'
    //document.getElementsByClassName('component-container')[0].style.background='RGBA(0,0,0,1)'
    直接修改网页图片
    NSString * script = @"document.getElementsByTagName('img')[0].src='http://findicons.com/files/icons/132/software_files/512/png.png'";
        [self.webView evaluateJavaScript:script
                       completionHandler:nil] ;
    
    -(void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation{
        [self.loadingView dismiss];
    
        [self.webView evaluateJavaScript:[XBSkinInstance getWebViewBgColor]
                       completionHandler:nil] ;
        UIColor * color = [XBSkinInstance getCurrentNavBgColor];
        if ([Ctx isLightColor:color]) {
            [self.webView evaluateJavaScript:[XBSkinInstance getWebViewLightTextColor]
                           completionHandler:nil] ;
        }else {
            [self.webView evaluateJavaScript:[XBSkinInstance getWebViewDarkTextColor]
                           completionHandler:nil] ;
        }
    }
    - (NSString  *)getWebViewBgColor{
        //[NSString stringWithFormat:@"document.body.style.background='RGBA(0,0,0,0.2)'"]
        NSString * webBgUserScript = [NSString stringWithFormat:@"document.body.style.background='RGBA(0,0,0,0.2)'"];
        return webBgUserScript;
    }
    - (NSString *)getWebViewLightTextColor {
    
        //document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '300%'
        //document.getElementsByTagName('body')[0].style.webkitTextFillColor= '#9098b8'
        //@"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'RGB(255,255,255)'";
        NSString * webLightTextScript = @"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'RGB(0,0,0)'";//黑色
        return webLightTextScript;
    }
    - (NSString *)getWebViewDarkTextColor {
        NSString * webDarkTextScript = @"document.getElementsByTagName('body')[0].style.webkitTextFillColor= 'RGB(255,255,255)'";//白色
        return webDarkTextScript;
    }

     20.ARC/MRC交换管理权

    ARC只能管理foundation框架的变量,如果程序中把foundation框架中的变量强制转换Core_Foundation框架的变量,需要交换管理权

    非ARC-ARC:插入-fobjc-arc

    ARC- 非ARC:插入-fno-objc-arc

     

    21.远程推送的原理就是:

    //1.手机或者说苹果自动将用户的UDID和应用的AplD发送到APNs,APNs返回一个 device Token给ioS设备,同一个手机不同的应用会生成不同的 device loken,同一个手机同一个应用只生成一个 device oken;
    //2手机端将 device Token发送到自己公司的后台服务器,用以保存;
    //3当后台需要推送消息给用户时,服务器将需要推送的消息和 device oken传输给APNs;
    //4“APNs将消息推送给指定的 device Token对应的手机5用户接收消息;

    22.给一个空指针发送消息会发生什么?

    函数不会执行无意义的操作,直接返回。

    23.设置视图View旋转90°显示

        XBBookCompletePromptView * completeView = [[XBBookCompletePromptViewalloc] initWithFrame:CGRectMake(0, 0, SCREEN_HEIGHT, SCREEN_WIDTH) withDelegate:self];
        completeView.center = CGPointMake(SCREEN_WIDTH/2, SCREEN_HEIGHT/2);
        [self.view addSubview:completeView];
        completeView.transform = CGAffineTransformMakeRotation(M_PI/2);

    24.价格处理优化 :四舍五入保留一位小数

        float a = 1412.244019;
        NSLog(@"a is %f", a); //output a is 1412.244019
        a = [[NSString stringWithFormat:@"%.2f", a] floatValue];
        NSLog(@"a is %f", a); //output a is 1412.239990
        //1. 您是否尝试过这个?
        CGFloat val = 37.777779;
        CGFloat rounded_down = floorf(val * 100) / 100; /* Result: 37.77 */
        CGFloat nearest = floorf(val * 100 + 0.5) / 100; /* Result: 37.78 */
        CGFloat rounded_up = ceilf(val * 100) / 100;  /* Result: 37.78 */
        NSLog(@"rounded_down:%.1f
    nearest:%.1f
    rounded_up:%.1f",rounded_down,nearest,rounded_up);

    25.获取tableviewCell在当前屏幕中的坐标值

        CGRect rectInTableView = [tableView rectForRowAtIndexPath:indexPath];
        CGRect rect = [tableView convertRect:rectInTableView toView:[tableView superview]];
        NSLog(@"==rectInTableView:=%@",NSStringFromCGRect(rect));

    26.获取当前页面是push 还是present过来的

       NSArray *viewcontrollers=self.navigationController.viewControllers;
        if (viewcontrollers.count>1) {
            if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) {
                //push方式
                [self.navigationController popViewControllerAnimated:YES];
            }
        }else{
            //present方式
            [self.navigationController dismissViewControllerAnimated:YES completion:nil];
        }

    28.Xcode工程清理

    干净的工程 (三清)

    1- 清理所有缓存数据  (Xcode—偏好设置——DerivedData文件下全部清空—最后Product—Clean)

    2- (window——Projects)

    3-  工程中蓝色工程文件—右键—shows in Finder —右键显示包内容 ——(齿轮文件不可删除)

    29.返回带Tabbar的首页

    //返回首页
    -(void)goHome {
    
      for (UIViewController *controller in self.navigationController.viewControllers) {
            if ([controller isKindOfClass:[HKHomeViewController class]]) {
                [self.navigationController popToViewController:controller animated:YES];
            }
        }
    
    方法:2:
    self.navigationController.tabBarController.hidesBottomBarWhenPushed=NO;
    //0表示返回到tabor第一个按钮的主页面,依此类推
    self.navigationController.tabBarController.selectedIndex=0;
    }

    30.第一次进入,让键盘弹出

    视图将要出现时<ViewWillAppear>
    [selfperformSelector:@selector(showKeyboard) withObject:nilafterDelay:0];
    
    viewDidLoad之后
    - (void)showKeyboard
    {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             [_inputTopic becomeFirstResponder];
        });
    }

    31.导航条字体样式设置

    //    1.设置左右两个Baritem 的字体颜色
    self.navigationController.navigationBar.tintColor = [UIColor redColor];
    //   2.设置标题字体大小和文本颜色
        [self.navigationController.navigationBar setTitleTextAttributes:
      @{NSFontAttributeName:[UIFont systemFontOfSize:19],
        NSForegroundColorAttributeName:[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]}];
    //   3.设置导航条的背景颜色
    self.navigationController.navigationBar.barTintColor = [UIColor blueColor];

    32.按钮无法点击原因:

    第一,可能你的按钮根本就没有实例化对象,
    第二,实例化对象了,但是没有加载到View上,
    第三,加载到View上了,但是Frame不对,超出试图了
    第四,Frame也存在,但是隐藏了按钮
    在imageView上面添加button 不能点击原因
    ①imageView父视图的交互性未打开打开
    ②UIButton一定要在父视图之内
    超出父视图之外 不能点击

    33.XIB屏幕适配常用:

    屏幕适配【AutoLayOut—SizeClasses 】
    
    Leading ->左边约束
    Trailing->右边约束
    Top->顶部约束
    Bottom->底部约束
    Center Horizontally In container 水平居中【trailing】
    Center Vertically     In container 中心垂直
    Equal Widths
    Equal Heights
    
    方向比例约束:Aspect Ratio  Constaint
    Constant:间距,间隔
    Priority:优先级
    Multiplier:宽高比例

     34.将所有警告设置为报错

    Build Settings->error->Treat Warnings as Errors :YES

     35.主线程卡死(案例)

    ①setData时不要使用延迟加载

    -(void)setDataArray:(NSArray *)dataArray{
    //SetData时不要使用延迟加载
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            _dataArray = dataArray.mutableCopy;
            [jingxuanDataSource setDataArray:dataArray.mutableCopy];
            [self reloadData];
        });
    }

    36.SDCycleScrollView图片显示加载不全

    设置imageView的contentMode

    //解决办法
    - (void)setupImageView
    {
        UIImageView *imageView = [[UIImageView alloc] init];
        _imageView = imageView;
        _imageView.backgroundColor = ColorWithRGB(242, 242, 242);
        _imageView.contentMode = UIViewContentModeScaleToFill;
        [self addSubview:imageView];
    }

    37.TextField过滤特殊字符

    //过滤其他字符-/()%^&$
    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    
        if (textField == _userNickNameTextField||textField==_babyNickNameTextField) {
    
            NSUInteger lengthOfString = string.length;  //lengthOfString的值始终为1
            for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) {
                unichar character = [string characterAtIndex:loopIndex]; //将输入的值转化为ASCII值(即内部索引值),可以参考ASCII表
                // 48-57;{0,9};65-90;{A..Z};97-122:{a..z}
    
                if (character < 48) return NO; // 48 unichar for 0
    
                if (character > 57 && character < 65) return NO; //
    
                if (character > 90 && character < 97) return NO;
    
                if (character > 122) return NO;
            }
            // Check for total length
            NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
            if (proposedNewLength > kMAXPASSWORDLIMIT) {
                return NO;//限制长度
            }
            return YES;
        }
        return YES;
    }
    
    -(void)textFiledDidEditingChanged:(NSNotification *)obj{
    
        for (UITextField *textField in tempArray) {
            NSString *toBeString = textField.text;
            //获取高亮部分
            UITextRange *selectedRange = [textField markedTextRange];
            UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
            // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
            if (!position) {
                //手机号显示
                if (textField.tag == USERNICKNAME_TEXTFIELD_TAG) {
    
                    if (toBeString.length > kMAXUSERNICKNAMECOUNTLIMIT)
                    {
                        NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, kMAXUSERNICKNAMECOUNTLIMIT)];
                        textField.text = [toBeString substringWithRange:rangeRange];
                    }
    
                }else if (textField.tag == BABYNICKNAME_TEXTFIELD_TAG)
                {
                    if (toBeString.length > kMAXBABYNICKNAMECOUNTLIMIT)
                    {
                        NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, kMAXBABYNICKNAMECOUNTLIMIT)];
                        textField.text = [toBeString substringWithRange:rangeRange];
                    }
                }
            }
    
        }
    }

    38.进制转换

    进制转换
    //十进制--->二进制
    /*
    对于整数部分,用被除数反复除以2,除第一次外,每次除以2均取前一次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位。
    对于小数部分,采用连续乘以基数2,并依次取出的整数部分,直至结果的小数部分为0为止。故该法称“乘基取整法”。
    */
    十进制,比如:6,如果将它转换成二进制数是110.从下往上读
    被除数
    计算过程
    商
    余数
    6
    6/2
    3
    0
    3
    3/2
    1
    1
    1
    1/2
    0
    1
    //二进制--->十进制
    二进制数100 换算成十进制
    用横式计算为:
    0*2^0+0*2^1+1*2^2 = 4
    
    //十进制--->八进制
    /*
    10进制数转换成8进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成8。
    */
    将十进制数120转换成八进制数。
    用表格表示:
    被除数
    计算过程
    商
    余数
    120
    120/8
    15
    0
    15
    15/8
    1
    7
    1
    1/8
    0
    1
    120转换为8进制,结果为:170//八进制--->十进制
    八进制就是逢8进1,采用0-7这8个数来表达一个数。八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……
    将八进制数1507转换成十进制数:
    7*8^0+0*8^1+5*8^2+1*8*3 = 839
    
    //十进制--->十六进制
    10进制数转换成16进制的方法,和转换为2进制的方法类似,唯一变化:除数由2变成16。
    将10进制数120转换成16进制数:
    被除数
    计算过程
    商
    余数
    120
    120/16
    7
    8
    7
    7/16
    0
    7
    120转换为16进制,结果为:78//十六进制--->十进制
    16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用
    A,B,C,D,E,F这六个字母来分别表示10,1112131415。字母不区分大小写。
    十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
    一个十六进数 2AF5, 那么如何换算成10进制呢?
    用竖式计算:
    2AF5换算成10进制:
    第0位: 5 * 160 = 5
    第1位: F * 161 = 240
    第2位: A * 162 = 2560
    第3位: 2 * 163 = 8192
    -------------------------------------
    10997
    直接计算就是:
    5 * 160 + F * 161 + A * 162 + 2 * 163 = 10997
    (别忘了,在上面的计算中,A表示10,而F表示15)

     39.APP用户无操作一段时间后执行其他操作

    //XBTimeOutApplication.h中
    #import <UIKit/UIKit.h>
    #import <AVFoundation/AVFoundation.h>
    
    //定义应用程序超时时间,单位为分钟,因此我们会在这个数上乘以60,以便折算成秒数。
    #define kApplicationTimeoutInMinutes 3
    //定义通知名称,其真实内容是字符串 "timed out"
    #define kApplicationDidTimeoutNotification @"AppTimeOut"
    
    @interface XBTimeOutApplication : UIApplication{
        NSTimer    *myidleTimer;
    }
    -(void)resetIdleTimer;
    @end
    
    //XBTimeOutApplication.m中
    #import "XBTimeOutApplication.h"
    
    @implementation XBTimeOutApplication
    // 监听所有触摸,当屏幕被触摸,时钟将被重置
    
    -(void)sendEvent:(UIEvent *)event {
    
        [super sendEvent:event];
    
        if (!myidleTimer) {
    
            [self resetIdleTimer];
    
        }
    
        NSSet *allTouches = [event allTouches];
    
        if ([allTouches count] > 0) {
    
            UITouchPhase phase= ((UITouch *)
    
                                 [allTouches anyObject]).phase;
    
            if (phase ==UITouchPhaseBegan) {
    
                [self resetIdleTimer];
    
            }
    
        }
    
    }
    
    //重置时钟
    
    -(void)resetIdleTimer {
    
        if (myidleTimer) {
    
            [myidleTimer invalidate];
    
        }
        //将超时时间由分钟转换成秒数
        int timeout =
        kApplicationTimeoutInMinutes;
        myidleTimer = [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO];
    
    }
    //当达到超时时间,张贴 kApplicationTimeoutInMinutes通知
    
    -(void)idleTimerExceeded {
    
        [[NSNotificationCenter defaultCenter]
    
         postNotificationName:
    
         kApplicationDidTimeoutNotification
    
         object:nil];
        UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"用户无操作" delegate:@"OK" cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
        [alertView show];
    
    }
    @end
    
    //使用:
    - (void)addAppTimeOutNotification {
        [XBNotiCenter addObserver:self selector:@selector(videoPlayerNoActionEvent) name:kApplicationDidTimeoutNotification object:nil];
    }
    - (void)videoPlayerNoActionEvent {
        [self.smallScreenView.playerView enterFullScreen];
    }

    40.正则匹配URL

    正则表达式规则:
     - @"."表示匹配任意字符
     - @"+"表示匹配的数量,至少是一个
     - (.+)表示通配,至少一个字符
     - @"(.*)"表示匹配的数量可以任意,也可以没有
    
        // 编写正则表达式:只能是数字或英文,或两者都存在
        NSString * requestStr = @"http://localhost:3333/#/article?_k=1f9qae";
        NSString * regex = @"(.+)/#/(.*)\?_k=(.+)";
    
        // 创建谓词对象并设定条件的表达式
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    
        // 对字符串进行判断
        if ([predicate evaluateWithObject:requestStr]) {
            NSLog(@"Match");
        }
     

    41.手势事件与TableViewCell点击事件冲突

    //解决:
    -(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch {
        if([NSStringFromClass([touch.view class])isEqual:@"UITableViewCellContentView"]){
            return NO;
        }
        return YES;
    }
    
    //UITapGestureRecognizer和UIButton的点击事件冲突的解决办法
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if ([touch.view isKindOfClass:[UIButton class]])
        {
            return NO;
        }
        return YES;
    }

    42.字符串截取

    //截取字符串有如下方法
    
    [string substringToIndex:7];//截取掉下标7之后的字符串
    
    [string substringFromIndex:2];//截取掉下标2之前的字符串
    
    [string substringWithRange:range];//截取范围类的字符串
    
    //如何直接截取某串字符串的后8位
    [string substringFromIndex:string.length- 8 ];
    截取一个字符串中,两个指定字符串中间的字符串,
    
    // 要截取 "> 和 </ 之间的汉字内容:
        NSString *string = @"<a href="http">这是要截取的内容</a>";
        NSRange startRange = [string rangeOfString:@"">"];
        NSRange endRange = [string rangeOfString:@"</"];
        NSRange range = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length);
        NSString *result = [string substringWithRange:range];
        NSLog(@"%@",result);

    43.多个按钮设置只能点击其中一个按钮

    @property (nonatomic,strong) UIButton *selectedBtn; //记录选中的按钮
    -(void)titleBtnClick:(UIButton *)btn
    {
        if (btn!= self.selectedBtn) {
            self.selectedBtn.selected = NO;
            btn.selected = YES;
            self.selectedBtn = btn;
        }else{
            self.selectedBtn.selected = YES;
        }
    }
    
    - (void)buttonClick:(UIButton*)sender {
    
    
        if (sender!=self.selectedBtn) {
            _ascendingBtn.selected = NO;
            _descendingBtn.selected = NO;
            self.selectedBtn.selected = NO;
            sender.selected = YES;
            self.selectedBtn = sender;
        }else if (sender==self.priceBtn){
            sender.selected = !sender.selected;
        }else {
             self.selectedBtn.selected = YES;
        }
    }

     44.利用Xcode查看设备的UUID

    点击Xcode->Window->Devices->选择自己的设备

    45.UILabel添加Tap手势

    UILabel添加Tap手势时要把交互性userInteractionEnable属性打开,否则就无法点击

     46.UIScrollView设置子subView可伸缩

    self.scrollView.minimumZoomScale = 0.5;//最小缩放比例
    self.scrollView.maximumZoomScale = 2.0;//最大缩放比例
    //缩放
    -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
        return self.imageView;//告诉scrollView哪个view可以缩放
    }

     48.Storyboard设置导航控制器

    选择VC->Editor->Embed in ->Navigation ViewController

     49.绝对值设置

    iOS 绝对值
    // 处理int类型的取绝对值
    int abs(int i); 
    //处理double类型的取绝对值
    double fabs(double i); 
    //处理float类型的取绝对值
    float fabsf(float i);

    50.iOS强制转换

    //格式:(要强转的类名*)系统的cell
    UICollectionViewCell *targetCell = [collectionView cellForItemAtIndexPath:indexPath];
    [(XBMineOpusCell*)targetCell checkBtn].hidden = YES;

     51.延迟执行和取消延迟执行

    延迟执行

    [self performSelector:@selector(scrollDone) withObject:nil afterDelay:0.5];

    取消延迟执行

    在0.5秒内取消执行函数,带的参数必须一样,才能取消
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(scrollDone) object:nil];

     52.判断文件的后缀名

    //判断图片的后缀名
    //[topic.image1.pathExtension.lowercaseString isEqualToString:@"gif"]

    53.对象转换成字典

        //将对象转成字典
        NSDictionary *dict = @{@"name" : @"why", @"age" : @18, @"height" : @1.88};
        
        Person *p = [[Person alloc] init];
        [p setValuesForKeysWithDictionary:dict];
        
        NSDictionary *dict1 = [p dictionaryWithValuesForKeys:@[@"name", @"age", @"height"]];
        NSLog(@"%@", dict1);

     54.ARC和MRC混编交换管理权

    非ARC-ARC:插入-fobjc-arc
    ARC-非ARC:插入-fno-objc-arc

     

     

  • 相关阅读:
    sql--删除
    数据库--范式
    sql语句--插入
    sql--查询
    shapefile数据文件组成
    sql---应用
    sql语句 函数
    SWIG:Simple Wrapper and Interface Generator
    职责链模式
    mybatis 装饰模式【Executor】 缓存篇
  • 原文地址:https://www.cnblogs.com/StevenHuSir/p/Project_BaseConfig.html
Copyright © 2020-2023  润新知