由于之前没有用过Swift开发应用,所以使用纯Swift从0开始一个项目,还是会遇到一些不理解的问题的。
本文仅作为我在使用Swift过程中遇到的问题,以及解决方法。仅仅作为自己记录用。 不保证正确,只是记录一下自己理解的过程,后续再来看可能又发现了问题,也可能会觉得这都是啥问题,太基础了,那时候好特么菜啊。
其他人可能也看不懂怎么回事,云里雾里的。 先大概记录下自己的理解,后续再来整理纠正。
1、# selecter 方法怎么传递参数? 目前会能传一个。。 ------ 解决办法: 想传多个参数,直接写可能不好写或报错了。 那就先写func 方法,然后在# selecter里去调这个方法,多少参数都行啦😄
2、导航栏默认透明色?? 按系统设置。iOS 15之后新特性,必须设置。
3、自定义导航栏,push到下一个界面,怎么自定义返回导航栏? - 还是要用一个BaseNavigationVC
4、自定义View,传参数进来, 闭包回调。 可以用属性didSet方式,如果数据已经有了,在初始化方法中添加参数。
5、使用Moya请求,Task设置方式: 如果参数是拼在URL后面的 就用return .requestParameters(parameters: params, encoding: URLEncoding.default)
如果参数是放body里面的, 就用 return .requestParameters(parameters: paramsDict, encoding: JSONEncoding.default)
方式
Get 请求URL入参问题: 到现在我还是采用在BaseUrl里方式, 后端URL没支持Decode吗是因为? 有特殊字符就不行???
www.jianshu.com/p/32a56897c...
Moya请求入参支持直接传数组类型 解决方案:
www.jianshu.com/p/19f3d0273...
Moya网络请求相关:
1、入参问题 - 支持数组入参。
2、拼接参数问题- 直接将参数拼接在URL后面,有特殊字符?&等,解析失败。 后端处理URL没有做Decode?
3、参数类型。------ 如果是拼在URL后面的 就用 URLEncode 如果参数是放body里面的 就用 JSONEncoding.default。
4、解析:
A。如果使用Codable解析, Model定义属性类型必须与接口返回的类型一致,即使有一个对不上,也会解析失败
B。如果有值就返回,没有值就返回null的,要定义为可选型,可选型就不用加默认值了。 但要注意,这个可选型也必要要与接口有值时返回的类型一致。
C。其他确定会返回的值,定义为非可选,给一个默认值,解析有值会覆盖的。
D。如果是返回数据data可能为null情况,请求发起就不用再ViewModel里了。不然回调回数据来判空不方便,因为callback了model回来,model都有默认值或可选值,model肯定不为nil了。 直接在VC里发起请求,回来数据直接判nil。
E。使用HandyJson解析时候,属性不与接口返回的类型一致貌似也可以解析成功。 都定义成非可选也行。 ------ 要去验证下,属性类型与接口不一致可不可以!!!!=== 可以的,最后为你定义的类型,自动做了转化吗?。。
F。如果返回的data都可能是null,成功就是简单的一个值。 就不用定义新的Model了,直接使用AnyCodable接就行了。
G。基于上面那种情形,请求入参Model要用Model?.self这样可选。
H。如果数据是data: [{},{}]这种,请求的入参Model就是[model].self 即可。
I。设置Model时,不管属性定义为是否可选型,如设置了默认值,有值就覆盖,没有就显示默认值。 定义为可选型,没设置默认值(实际也不用设置),有值返回就解析,没有就都是nil
J。定义Model时,多几个属性、少几个没有关系。 但是不确定类型的必须定义为可选型,而且这个可选型类型必须与有值返回的类型一致。
H5与原生交互方面:
1、如果我想在加载H5之前就给H5传点什么东西,使用
php
let script = WKUserScript(source: "window.platform = 'iOS'", injectionTime: .atDocumentStart, forMainFrameOnly: true)
configuration.userContentController.addUserScript(script)
这样就能告诉H5是iOS平台了。
1.1如果想加载完成H5后发送消息,通过
ini
let script = "window.webkit.messageHandlers.messageHandler.postMessage('Hello, H5!')"
webView.evaluateJavaScript(script, completionHandler: nil)
这个方法给H5发送一个消息。其中window.webkit.messageHandlers.messageHandler.postMessage
这个方法是自定义的,也就是H5写的方法,随便叫什么名称都行,约定好一致即可。
2、如果想处理H5的某些事件。 我们先和H5约定好事件名称,通过configuration.userContentController.add(self, name: "MessageHandle")
这个方法约定好。 然后在代理方法
swift
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
switch message.name {
case "MessageHandle":
print("处理handle数据")
default: break
}
}
这里判断做相应的处理就好了.
友盟不支持真机调试解决方案:
www.jianshu.com/p/32917b7db...
第一次从头到尾申请设置苹果证书相关:
JSBridge 方案
Json字符串互转
www.cnblogs.com/CoderEYLee/...
拍照:
完全自定义相机
www.jianshu.com/p/8b28892ba... blog.csdn.net/u011146511/...
codeantenna.com/a/XbVsJMZku...
条形码扫码
微信支付:
developers.weixin.qq.com/doc/oplatfo...
// 具体步骤
pay.weixin.qq.com/wiki/doc/ap...
demo