ios开发问题汇总(一)
教程汇总
- IOS比较好的网络教程:IOS编程浅蓝教程
- IOS编程教程(五)自定义UITableView的表单元格
- 菜鸟教程-iOS教程
开发问题
- 实现页面切换,网上某些文章写的是:
[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;
和类静态变量作用一样。
- 添加constraint后不显示,可能是高度未设置,值不能全为相对值。有时设置高度也没用,必须要有内容才能显示,和css类似。
- SafeArea是什么:iOS 11 safeArea详解 & iphoneX 适配。SafeArea下的content view的高度是随着内容改变的,所以在添加高度的constraint时,一般相对于SafeArea才能进行有效的高度设置。
- UIScrollView的FrameLayout和ContentLayout:iOS 11 适配工作
- iOS中的颜色:ios开发常用RGB色值
- 如何设置UILabel的内边距?
- Storyboard中,TabBarNavigator文字不更新,第一种解决方法是重新连线,第二种解决方法是取消本地化翻译,然后再次加载本地化翻译,在弹出的确认框中选择 “替换”。
- 使用Prototype Cell 自定义表视图
- UIPickerView自定义选中的字体颜色、字号、字体
- NSMutableAttributedString使用介绍
- UIButton 基础
- iOS UITableView动态隐藏或显示Item
- NSArray存结构体,可以参考:结构体存储在NSArray中的方式,不过需要注意,这样存的话,结构体必须为POD即基本数据类型。如果结构体中包含对象指针,则对象不会被正确释放。
- StoryBoard界面文字不更新,是由本地化文件导致的,保持Localization中Base不变,先取消勾选本地化语言,如English,Chinese等,再勾选,弹出的对话框中选择Replace File,即可更新翻译文件,解决界面文件不更新的问题。
- iOS之枚举用法
- iOS-代码加载storyboard中的ViewController
- 从url中获取文件名以及后缀
子控制器 addChildViewController
- addChildViewController时子控制器中的UI显示问题
- iOS笔记 addChildViewController
- iOS addChildViewController方法
- 以上文章都不靠谱,addChildViewController要和removeFromParentViewController成对调用,还要addSubView
- 报错:unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法,这个方法不怎么管用。也可以动画开始前关闭交互,动画结束后开启交互。对我来说也不管用。去掉removeFromSuperView就好了。
- transitionFromViewController方法没有动画的问题:transitionFromViewController方法的使用,按照这篇文章做,只需要在初始化时把所有的子ViewController通过调用addChildViewController加入到父ViewController,其他地方都不需要调用addChildViewController,也不需要removeFromParentViewController。addSubView也只是初始化时调用一次即可,不需要在其他地方调用。options参数只有填UIViewAnimationOptionTransitionXXX才有动画,这个才是动画类型,而UIViewAnimationOptionCurveEaseOut是动画方式。
遮罩mask,CALayer,贝塞尔路径
iOS 利用CAShapeLayer的FillRule属性生成一个空心遮罩的layer。要理解两种填充方式的区别。
对话框
导航
- iOS开发之导航栏各种右滑返回失效的解决方法汇总
- Segue导航与传值,官方文档:Customizing the Behavior of Segue-Based Presentations
- 关于Unwind Segue实现任意动态跳转,官方文档:Dismissing a View Controller with an Unwind Segue
- 右滑返回很神奇,多次启动右滑又取消,会多次触发popViewControllerAnimated和willShowViewController,但是取消右滑又不会触发任何函数。
界面
界面问题
- 关于UIButton嵌入到UIView点击无反应问题的解决方法和delegate的简单用法示例。在storyboard中画的大小在运行时就不是那么大了,需要通过约束来显式指定其位置和大小。
- 关于等宽字体。以前不知道等宽字体有什么用,直到我想在软件中显示计时时间,如果不用等宽字体,时间数值文字会不断跳动,不是我想要的效果。这个时候就需要等宽字体来显示数字。可以参考文章:IOS 上支持的等宽字体。但是ios自己用的等宽字体是:[UIFont monospacedDigitSystemFontOfSize:35 weight:UIFontWeightSemibold]。
- 圆角按钮:iOS 部分圆角的正确实现,在此基础上稍加修改即可。
- iOS拦截导航栏返回按钮事件的正确方式(二),此方法有问题,见:iOS 13 and UINavigationBarDelegate::shouldPop()。即
(BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
无论在模拟器还是在手机设备上都不调用。解决办法是重设delegate:self.navigationController.navigationBar.delegate = self;
不要采用catagory的方式实现,直接实现UINavgationController子类,并在Storyboard中设置导航控制器的类名即可。 - UINavigationController与UINavigationBar详解
- UITextField无法使用第三方键盘的问题。是因为设置了secureTextEntry为True的输入框,会使其前一个输入框也无法使用第三方输入框。百度啥也搜不到,见:Native UITextField Secure Text Entry forces English (US) keyboard,用谷歌搜。
- 实现滑动分页效果,类似于今日头条:iOS使用pageViewController实现多视图滑动切换
- iOS UITableViewCell左滑/侧滑删除 仿微信
- 如何像闹钟一样在锁屏界面显示自定义界面?Alarm presenting specific View Controller instead of notification for iOS 10
- 关于Xcode8新功能Trait Variations
- 自定义UITableViewCell时,.xib文件中的变量和事件,虽然和XxxTableViewCell里面的IBOutlet或IBAction连接起来了,但是事件不响应,而且变量修改无效,也就是没有关联起来。原因是我是通过File’s Owner的Outlets列表来连接的,这样无效,同时也设置了根View的class。取消File’s Owner的类设置,改用根View的Outlets列表来连接就行。用文字描述有点难懂哈,有问题评论区讨论。
- 如何确定UIToolBbar中UIBarButtonItem的位置?
- KxMenu,一个垂直方向展示的弹出菜单
界面元素
- iOS 人机界面指南精简版笔记之界面元素:Bars
- 高版本ios底部有一个横条,SafeArea不包含这个横条,如果UITableView的高度和SafeArea相同,那么屏幕底部就会有一块灰色区域。这个灰色区域不是什么控件,只要把UITableView的高度设置到和SuperView一样高就可以消除这块灰色的,遮挡UITableView的区域的了。
- UINavgationController包含是控制导航的。它包含的界面包括:app界面的导航栏和工具栏,并负责处理导航栏和工具栏的业务逻辑。夹在导航栏和工具栏中间的部分是我们的UIViewController业务子类,脑海里要有这个结构。
- UINavigationItem:这个类封装了UINavigationBar里面的所有元素,每个UIViewController对应一个navigationItem,可以使用self.naviigationItem访问。
对象间通信
信号槽
本地通知
自动布局
- 问题:LayoutConstraints] Unable to simultaneously satisfy constraints,约束冲突,参考:translatesAutoresizingMaskIntoConstraints 详解,即对约束的View,设置translatesAutoresizingMaskIntoConstraints = NO,禁用AutoResizing布局,防止冲突。
- 约束冲突时最常见的问题,例如设置了View上下距离为0来实现居中,但是因为View高度不够,这时候视图View就会靠上显示,这时候如果想要居中,就必须删除上下限制,改用NSLayoutAttributeCenterY中心点对齐。
- 左右同时设置内边距和设置宽度会冲突。
指针
- 对象指针不需要初始化,默认为nil,注意是ARC下的对象指针。
本地通知
远程通知
UITableView
- UITableView全面解析
- UITableView被导航栏遮挡的解决办法,如果是系统生成的NavigationController带的TableViewController,会出现这样的问题。个人建议删除这个系统创建的TableViewController,自新建一个普通的ViewController,它的SafeArea不包含导航条,在里面放一个TableView即可,这样不光可以放TableView,还可以放其他控件,一举两得。
- 如何在使用storyboard中使用tableViewController中的Prototype Cells 自定义cell,本以为不需要新建类就可以处理,其实最终还是避免不了要新建单元格类。Prototype Cells只是自定义的单元格的Ui界面而已,并不会自动实例化,需要在cellForRowAtIndexPath回调中,通过dequeueReusableCellWithIdentifier:@”单元格identifier”来创建。
- iOS: 在UIViewController 中添加Static UITableView,Static Table Cell。
- iOS 9 Storyboard 教程(二上)介绍Segue静态单元格(static cell),个人喜欢使用动态单元格,更灵活。
- 关于tableView的reloadRowsAtIndexPaths,可以了解到cell重用的机制。
- UITableView 在UITableViewStylePlain模型下,取消headerView的黏结性,不浮动
- UITableView在style为plain时,实现sectionHeader跟随cell移动
- iOS UITableView 实现去除Section的分割线,保留Cell的分割线
- UITableviewFooter上拉显示不全的问题,我没有用文中的做法,而是添加约束:table.bottom = SuperView.bottom
- iOS UITableView section圆角阴影
- 解决UITableViewStylePlain方式headerView顶端 滞留的代码
- iOS UITableView获取特定位置的cell
- 将UITableViewCell设置为圆角,困扰了我很久,一句代码就可以搞定:
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"];
多线程
应用设置
数据库
代码相关
本文来自博客园,作者:撬动未来的支点,转载请注明原文链接:https://www.cnblogs.com/pivotfuture/p/16297317.html
CSDN:撬动未来的支点,公众号:Qt未来工程师,网站:www.qtfuture.cn