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:@"点击了“%@”字符\nrange: %@\nindex: %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\nnearest:%.1f\nrounded_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

 

 

转载于:https://www.cnblogs.com/StevenHuSir/p/Project_BaseConfig.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值