教程汇总

开发问题

  • 实现页面切换,网上某些文章写的是:
[self.navigationController performSegueWithIdentifier:@"ShowDetail" sender:self];

这么写的话,软件运行时会报错:

‘Receiver (<UINavigationController: 0x7f8e2781f400>) has no segue with identifier ‘ShowDetail’’

解决办法是:

[self performSegueWithIdentifier:@"ShowDetail" sender:self];

也就是说应该用转场segue的源页面的控制器self来作为函数调用(oc中叫通知)对象。

找了两天终于找到这个问题的答案:https://stackoverflow.com/questions/20715462/receiver-viewcontroller-has-no-segue-with-identifier-addsegue,百度啥也搜不到啊,都是你抄我我抄你,难。

  • OC语言不支持类静态变量,但是支持类静态属性,如
@property (class, nonautomic) int a;

和类静态变量作用一样。

子控制器 addChildViewController

遮罩mask,CALayer,贝塞尔路径

iOS 利用CAShapeLayer的FillRule属性生成一个空心遮罩的layer。要理解两种填充方式的区别。

对话框

导航

界面

界面问题

界面元素

  • iOS 人机界面指南精简版笔记之界面元素:Bars
  • 高版本ios底部有一个横条,SafeArea不包含这个横条,如果UITableView的高度和SafeArea相同,那么屏幕底部就会有一块灰色区域。这个灰色区域不是什么控件,只要把UITableView的高度设置到和SuperView一样高就可以消除这块灰色的,遮挡UITableView的区域的了。
  • UINavgationController包含是控制导航的。它包含的界面包括:app界面的导航栏和工具栏,并负责处理导航栏和工具栏的业务逻辑。夹在导航栏和工具栏中间的部分是我们的UIViewController业务子类,脑海里要有这个结构。
  • UINavigationItem:这个类封装了UINavigationBar里面的所有元素,每个UIViewController对应一个navigationItem,可以使用self.naviigationItem访问。

对象间通信

信号槽

[Objective-C] selector 简介

本地通知

自动布局

  • 问题:LayoutConstraints] Unable to simultaneously satisfy constraints,约束冲突,参考:translatesAutoresizingMaskIntoConstraints 详解,即对约束的View,设置translatesAutoresizingMaskIntoConstraints = NO,禁用AutoResizing布局,防止冲突。
  • 约束冲突时最常见的问题,例如设置了View上下距离为0来实现居中,但是因为View高度不够,这时候视图View就会靠上显示,这时候如果想要居中,就必须删除上下限制,改用NSLayoutAttributeCenterY中心点对齐。
  • 左右同时设置内边距和设置宽度会冲突。

指针

  • 对象指针不需要初始化,默认为nil,注意是ARC下的对象指针。

本地通知

远程通知

UITableView

cell.layer.cornerRadius = 10

界面美化

动画

  • CABasicAnimation.beginTime:是绝对时间,应该用CACurrentMediaTime()+n,否则设置无效。

IOS应用本地化/国际化

多媒体

系统提示音

  • iOS系统提示音的使用
    这个问题,搞了一天,能踩的坑都被我踩了。。方法和代码参考上面的链接。
    在模拟器中使用上面的方法是获取不到系统提示音列表的。通过代码枚举目录,在iOS模拟器中运行,进入到路径/System/Library/Audio/UISounds/下,发现什么都没有。这导致我认为这个方法太老了不能用,差点放弃。在互联网上搜了很久,只有这个方法。而且在仓库https://github.com/TUNER88/iOSSystemSoundsLibrary的issue列表中,看到有人说高版本iOS也可以用(我用的是iOS14.5)。又继续尝试这个方法。经过不断枚举,发现iOS模拟器中的目录完全就是mac电脑的目录啊!于是换成在真机上测试(iphone11)。
    在我自己的手机上,逐个目录枚举,发现只能枚举到根目录下的内容,子目录,比如/System下的内容就枚举不出来了。一筹莫展时,将路径直接改为/System/Library/Audio/UISounds/,列表竟然出来了。也就是说虽然上级目录无法枚举,但是指定目录还是可以枚举的!
  • iOS录音后播放声音变小的解决方法
  • iOS音频Error
  • 项目中需要录音,但是在录音开始和结束时,播放1113和1114系统提示音,结果出现提示音播放声音变小的问题。上面给出的两篇文章虽然给出了相关代码,但是并没有完全解决我的问题。最后在多次尝试下得出最终的解决方案,即一定要保证代码顺序,先开启录制,再设置音频会话参数,最后再播放系统提示音!顺序错了的话,设置音频会话参数无效。
  • 先录音再播放时出现问题,没有声音。录音文件5kb,但是播放时没有声音,以为是播放问题。参考AVAudioPlayer播放音频文件时没声音。后面通过打印音频文件时长得知,音频文件还不到0.1秒。那么肯定是录制的问题了。经过修改代码,audio session的设置一定要在record之前,否则录音会失败!

文件系统

  • fileURLWithPath,不要用relativeToURL,否则不会带有file:///前缀,导致某些函数报错无法识别。
  • iOS fileExistsAtPath:函数返回结果错误
  • 用NSFileManager的fileExistsAtPath检查file:///前缀的文件路径指向的文件是否存在,会返回失败。要使用NSURL的checkResourceIsReachableAndReturnError函数来检查。
  • pathForResource返回nil,以及UIWebView本地加载html、css/js,文件名和后缀名分开写,例如加载1.html:NSString *filePath = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"html"];

多线程

应用设置

数据库

代码相关