iOS小计3

提示:由于水平有限,如发现有疑问或错误的地方请毫不客气的提出、讨论,我会在第一时间回复,感谢在先

在A_ViewController中对使用Xib创建的B_ViewController中IBOUT拉出来的控件赋值为空的问题;造成这种结果的原因是:当我们对B_ViewController 拉出来的控件赋值的时候,控件的初始化还没有完成.解决方法:

  • B_ViewController中添加一个用于临时保存值的属性.在B_ViewController 初始化完成后给B_ViewController IBOut的控件赋值
  • 如果是iOS9以后的版本 可以调用[B_ViewController loadViewIfNeeded]方法,iOS9 之前最好不要调用[B_ViewController loadView];在添加ViewController的时候最好设置其frame 然后再addChildViewController操作.

注意系统API返回容器是否可变

  • 也许你声明的时候与写getter方法的时候返回的是NSMutArray;但是在编码过程中误操作把它设置为不可变的 NSArray,然后调用可变数据的方法就会崩溃.eg:之前定义的是可变的数组,但是经过对NSMuArray内容的筛选后返回的是不可变的数组,返回时不可变的数组.

关于数组一些问题:

  • [__NSArrayI removeObject:]:unrecognized selector sent to instance 0xa391640:出现这种崩溃信息说明数组已经是NSArray;而不再是NSMutArray;其次可变容器是不能一边遍历,一边进行删除操作的

SVN一些常见设置

  • UI切图放在360云盘里了,下载的时候自动从压缩包里面解压了,结果是用SVN提交的时候出错,说有些图片的前缀有不可打印的字符,不能提交,图片前面会出现?号。解决方法:苹果电脑上面解压应用对带有汉字的压缩支持不太好,把网盘上面的压缩包的中文名字改成英文.
  • svn默认会忽略一些文件. 比如.a文件是不能提交到svn;
    选择Versions的菜单View–>Show Ignored Items,这样就会显示出ignored的文件,找到你要上传的.a文件,右键“Add”就行.

LanchScreen在iOS7.0以及之前的版本是不支持的

Xcode中lib、frme搜索路径设置

  • 在设置工程的library search path 或者 framework search path 的时候 , 一定要先配置好搜索的路径 ,一般都是相对路径. <使用绝对路径容易出现问题,比如使用代码管控工具,会找不到库>
    $(SRCROOT)宏和$(PROJECT_DIR)宏都指xxx.xcodeproj所在的父目录;$(inherited) 表示继承关系.

一定要避免自己写的类、方法与系统提供的API不能重名,尽量少重写系统提供的方法.当使用别人提供的第三方库、或者自己之前写过的为已知类添加的分类,有可能从写了系统的方法,这个时候首先执行的是第三方或者是自己添加到类目中方法,排查这种错误时候可以打断点跟踪一下代码执行或者通过搜索文件方式去查找是否存在重写系统方法的分类.

关于证书的一些问题

  • our build settings specify a provisioning profile with the UUID “XXXXXX”,however, no such provisioning profile was found 引起这种情况有两种原因:

    1. provision 文件与证书不匹配;要重新设置一下.
    2. provision文件丢失.也就是找不到. 检查你的provision文件是否被删除, 如果被删除重新下载安装.
      如果还是不行可以进行如下操作:

      1. 找到项目中的**.xcodeproj文件,点击右键,show package contents(打开包内容).
      2. 打开后找到project.pbxproj文件,用文本编辑器打开。其实就是右键,点击open就好了.
      3. 打开这个文件后,按command+F,在这个文件中查找“PROVISIONING_PROFILE”,找到和这个PROVISIONING_PROFILE=”487F3EAC05FB4A2A9EA031F1F35760EB”;”PROVISIONING_PROFILE[sdk=iphoneos*]” = “487F3EAC-05FB-4A2A-9EA0-31F1F35760EB”;”类似的都删除.
  • The certificate used to sign “XXXXX” has either expired or has been revoked. An updated certificate is required to sign and install the application;证书已过期或者被revoked需要更新证书)解决方法:

    1. 在打开Xcode Meun菜单下的Preference
    2. 选择Account>Team>ViewDetails
    3. 在Profileslist中选中任意一个Provisionfile
    4. 右击选中的ProvisionFile > Show in Finder ,然后把所有Provision删除
    5. 点击DownLoadAll重新下载ProvisionFile

Property && Synthesize && Dynamic

property:是封装数据的地方: 除了根据(readwrite/readonly)生成对应的setter、getter方法以外,还会生成一个带有下划线与属性名相同的实例变量.
synthesize:用来指定属性对应成员变量的名称.
dynamic:告诉编译器不要生成getter、setter 方法.

@interface SteStudent : NSObject
@property (copy, nonatomic) NSString* name;
@property (assign, nonatomic) int score;
@end
  
@implementation SteStudent
//生成一个name实例变量.
@synthesize name; 
//生成一个_score的实例变量.
@synthesize score = _score; 
  
- (void)testSynthesize{

    self.name = @"name"; 

/*
Important: If you use @synthesize without specifying an instance variable name, like this:
@synthesize firstName;
the instance variable will bear the same name as the property.
In this example, the instance variable will also be called firstName, without an underscore.
如果没有指定要生成的实例变量,那么就会生成一个和属性名相同的实例变量.
 */
 
_name = @"yourName"; //报错

/***synthesize小结
如果指定了成员变量的名称,会生成一个指定的名称的实例变量.
例如:@synthesize customPro = _customPoy;设置属性变量可以通过_customPoy来设置.
如果这个实例已经存在了就不再生成了,例如:
@implementation SteStu {
 //已经存在一个_customPoy实例变量就不会再生成.
 id _customPoy ; 
}
如果是@synthesize customPoy;则会生成一个名称为customPoy的实例变 量-没有下划线.
如果是@synthesize property = _foo;生成一个带下划线的_foo实例变量
*/

}

什么情况下不会自动合成属性变量.

  • 同时重写setter 和 getter时(可以在implemention里面单独实现或者利用synthesize指定)
  • 重写只读属性的 getter 时
  • 使用@dynamic property 时
    (对于上面三种情况,可理解为编译器认为我们自己需要根据readwrite或者readonly 来手动实现对应的getter、setter方法,所以没必要合成一个实例变量)
  • 在@protocol 中定义的所有属性
  • 在category 中定义的所有属性
  • 子类重载父类的属性;在子类中访问父类_property报错;

iOS添加其他字体
项目中用到了PingFangSC字体,但是在iOS8中并不支持这里给出两种解决方法:

  • 下载PingFangSC字体并且添加到工程中,因为字体库一般很大,这样会增大包的大小

    1. 根据需要找到所需字体的PostScript然后下载并拖进自己的工程中.
    2. 在Plist文件中添加 Fonts Provided By application 描述.
    3. 根据需要创建自己所需字体.
      具体细节参考:https://codewithchris.com/com…
  • 动态下载下载到iOS系统中;包大小不会增大.

    1. 找到所需字体的PostScript然后添加到下载列中;如果已经下载就不用再次下载.
    2. 根据需要用UIFont创建所需字体.
      具体细节参考:http://blog.devtang.com/2013/…

AttributedString属性设置时使用CoreTextApi设置下划线颜色没有效果.
设置UILabel.attributedString下划线时使用CoreTextAPI没有效果;设置的时候尽量使用Foundation框架里对应的key去设置


   NSMutableAttributedString* mutAttString =  
   [[NSMutableAttributedString alloc]initWithString:@"Do     what you wanna do!"];

    //这样设置没有效果.
    [
    mutAttString 
        addAttribute:(id)kCTUnderlineColorAttributeName  
               value:(id)[UIColor redColor].CGColor  
               range:NSMakeRange(0, 4)
    ];
    
    //使用Foundation中对应的key进行设置.
    [
    mutAttString  
         addAttribute:NSUnderlineColorAttributeName  
                value:[UIColor redColor]   
                range:NSMakeRange(0,4)
    ];
    
    原文作者:Stephanie
    原文地址: https://segmentfault.com/a/1190000011096890
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞