各种杂项知识点与项目中的坑

9 篇文章 0 订阅

各种好的写法

  1. self.TableView.indexPathForSelectedRow.row;
    在外部找到点击的tableView行和分区;
  2. 获取当前显示vc
- (UIViewController *)getCurrentVC
{
    UIViewController *result = nil;
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    
    if (window.windowLevel != UIWindowLevelNormal)
    {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows)
            {
            if (tmpWin.windowLevel == UIWindowLevelNormal)
                {
                window = tmpWin;
                break;
            }
        }
    }
    
    UIView *frontView = [[window subviews] objectAtIndex:0];
    id nextResponder = [frontView nextResponder];

    if ([nextResponder isKindOfClass:[UIViewController class]]){
                 result = nextResponder;
    } else{
                result = window.rootViewController;
    }
    return result;
}


大坑的地方
cannot find interface declaration for nsdata 这个问题可能是交叉引用问题,也有可能是UIKit 没引用!!!!

@class的含义 和 #import
两种都是引入方式,这两种的方式的区别在于:
1、#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息;
2、使用@class方式由于只需要只要被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以需要使用#importl来包含被引用类的头文件;
3、通过上面2点也很容易知道在编译效率上,如果有上百个头文件都#import了同一 个文件,或者这些文件依次被#improt(A->B, B->C,C->D…),一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来 讲,使用@class方式就不会出现这种问题了;
一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

基本图形绘制
Quartz2D提供了以下几种类型的Graphics Context:
Bitmap Graphics Context
PDF Graphics Context
Window Graphics Context
Layer Graphics Context
Printer Graphics Context
只要上下文不同,绘制的地方就不同。
UIGraphicsBeginImageContextWithOptions的功能相同,相当与UIGraphicsBeginImageContextWithOptions的opaque参数为NO,scale因子为1.0。
UIGraphicsBeginImageContextWithOptions
函数原型为:
void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
size——同UIGraphicsBeginImageContext
opaque—透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。
scale—–缩放比例,iPhone 4是2.0,其他是1.0。虽然这里可以用[UIScreen mainScreen].scale来获取,但实际上设为0后,系统就会自动设置正确的比例了。
调用begin的时候最后别忘了调用:UIGraphicsEndImageContext

用AFN网络请求时错误集合
1.Domain=NSCocoaErrorDomain Code=3840 “Invalid value around character 0.” UserInfo={NSDebugDescription=Invalid value around character 0

 //增加这几行代码;  
  AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];  
  [securityPolicy setAllowInvalidCertificates:YES];  
//这里进行设置;  
  [manager setSecurityPolicy:securityPolicy];  
  manager.responseSerializer = [AFHTTPResponseSerializer serializer];  

2.Error Domain=NSURLErrorDomain Code=-1002 “unsupported URL”
请求的串中包含有中文字符,最后解决方案是把其中的一个含有中文字符的参数q对应的text进行编码

[text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

3.Error Domain=com.alamofire.error.serialization.response Code=-1011 “Request failed: internal server error (500)” UserInfo=0x7fb191423d00 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7fb1916229a0>

类似这种报500的错误不一定是服务器的错误 ,有可能是你的请求参数有问题,还有可能是你请求的响应数据有问题,你看afn的报错中是不是有 text/html 这种字样 ,有的话就

    // 设置响应数据类型
    [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css",@"text/plain", @"application/javascript",@"image/jpeg", @"text/vnd.wap.wml",@"application/xml",@"application/soap+xml",@"text/xml", nil]];

添加上,这个是我的胃了保证都有基本上都写上去了,有补充的欢迎留言,哈哈

  1. 当用AFN 请求 SOAP web service 的时候 @“text/xml” 是针对XML数据的 responseSerializer 请求数据类型,

报错Linker command failed with exit code 1 (use -v to see invocation)
1.其中有一种可能是你使用了pod 但是你有的第三方还是copy进去的,会导致文件路径不正确,其中other linker flags 中的 -l"AFNetworking" 这种路径是pod的路径,
2…a文件没添加上去,用svn管理代码得话是不会提交.a文件的,检查下.a文件是不是因为svn的问题没下载下来,

TableViewCell 留出空白间距的方法

-(void)setFrame:(CGRect)frame {
    frame.origin.y += 10;
    frame.size.height-=10;
    frame.size.width-=10;
    frame.origin.x +=5;
    [super setFrame:frame];
}

MJ刷新不回弹,问题没有解决,求方法

ERROR ITMS-90167: "No .app bundles found in the package"
电脑系统升级到 sierra 导致的上传失败,用 application loader 3.6的 也就是Xcode 8 自带的可以上传,以下的不可以,你可以打包之后用之前系统的电脑上传是没有问题的 ,或者再装个8.0

UI控件的创建问题
当写属性时,

/*设置标题栏*/
@property (nonatomic, weak) UIView *titleView;

创建方式

    //标题栏
    UIView *titleView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.width, LXQTitleViewH)];
    titleView.backgroundColor = [[UIColor whiteColor]colorWithAlphaComponent:0.5];
    [self.view addSubview:titleView];
    self.titleView = titleView;

addSubview 就相当于view 对这个UI控件进行了强引用, 所以代表这个view不被销毁这个控件就不会被销毁,既然强引用了 就没必要再搞一个强指针指着了 一个弱指针就好。
同时这个地方创建控件也可以懒加载的方式 可读性强 耦合性地 而且 内存占用率会降低 特别是大型项目 内存使用情况更优化。
那个属性如果写成strong 的话 有可能会造成野指针(为什么????,)
这个地方深入的了解还没有 ,一步一步随时更新 欢迎各位评论指正。

项目中有的时候改需求会导致UI位置的不断调整,其中可以使用 [self.view insertSubview:view atIndex:位置];
这个写法与add的区别就是

[view addSubview:vieww] == [view insertSubview:oneview atIndex:view.subviews count];

还有就是 insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview; 表示向指定的子视图之下,插入该视图;
insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;表示向指定的子视图之上,插入该视图。

CUICatalog: Invalid asset name supplied:
[UIImage imageNamed:name];但是这个name却是空的,所以就报了这个错了。
解决方法,在项目中搜索UIImage imageNamed:,然后打印看看所谓的name是否为空。找到后替换。

layoutSubviews和viewDidLayoutSubviews
先调用试图控制器的viewWillLayoutSubviews 以及viewDidLayoutSubviews,然后调用view的layoutSubviews、layoutSubviews 。最后调用drawRect
1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

Expression is not assignable
self.view.frame.size.height = 100;或者 scrollView.contentOffset.y = 10;
self.view.frame是Objective-C语法,是读取view属性的frame属性,在Objective-C中使用点来访问属性只是一种语法糖,所以self.view.frame这句话会被转换成:
[[self view] frame]
scrollView.contentOffset 也是如此;
也就是说,实际上这是消息传递。
而frame(contentOffset)属性是一个CGRect(CGPoint)结构,所以frame.size.height是C语言的语法,就是访问CGRect结构中的size字段,同样,height是CGSize结构的一个字段。
因此,当你打算直接给函数的返回值赋值的时候,编译器告诉你"这个表达式无法被赋值"。这就是这个错误的出现原因。
一种解决办法就是另写个CGRect 然后让size 去等于它,scrollView.contentOffset就写成 scrollView.contentOffset = CGPointMake(0, 0);
好尴尬啊这个地方

真机设备 has denied the launch request.
Internal launch error: process launch failed: failed to get the task for process 42250

在debug下无法真机运行,可以启动。不同人遇到问题不一样,我的解决方法是:
** Project -> Target ->* 项目名称 *-> Build Settings -> Code Signing Entitlements **
其中 debug 模式改为 iPhone Developer

这个报错的原因一般来说是远程Provisioning Profile(以下简称PP)和本地的配置不同造成的问题,细看下来可能有这么几种可能:
1.PP文件和Capability配置不匹配;
2.PP文件和本地证书不匹配;
3.跑应用时Debug和Release选择错误;
4.PP文件中没有包含当前要运行设备的UUID;
5.Xcode10中Build System问题(这个好像最新的Xcode已经修复了);
6.项目中多个Targets的证书选择错误(我就是这个问题);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值