由于之前没有用过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吗是因为? 有特殊字符就不行???
Moya请求入参支持直接传数组类型 解决方案:
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时,多几个属性、少几个没有关系。 但是不确定类型的必须定义为可选型,而且这个可选型类型必须与有值返回的类型一致。 I。定义Model使用泛型T, 请求或解析时候,如果没有传入T泛型,就直接给具体类型。eg:
struct ExWebRequestModel<T: Codable>: Codable {
var operate: String = ""
var data: T
}
struct ExamWebRequestCommonModel: Codable {
var params: String?
var path: String?
var phone: String?
}
struct ExamWebRequestParamModel: Codable {
var params: ExamWebParamsModel?
var path: String?
var phone: String?
}
Model定义为这样,为了可以不同的Model。解析时候这样<>直接给具体Model类型即可。
let model = try App.shared.decoder.decode(ExWebRequestModel<ExWebRequestCommonModel>.self, from: jsonData)
H5与原生交互方面:
1、如果我想在加载H5之前就给H5传点什么东西,使用
let script = WKUserScript(source: "window.platform = 'iOS'", injectionTime: .atDocumentStart, forMainFrameOnly: true)
configuration.userContentController.addUserScript(script)
这样就能告诉H5是iOS平台了。
1.1如果想加载完成H5后发送消息,通过
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")这个方法约定好。
然后在代理方法
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
switch message.name {
case "MessageHandle":
print("处理handle数据")
default: break
}
}
这里判断做相应的处理就好了.
友盟不支持真机调试解决方案:
第一次从头到尾申请设置苹果证书相关:
JSBridge 方案
Json字符串互转
拍照:
完全自定义相机
www.jianshu.com/p/8b28892ba… blog.csdn.net/u011146511/…
条形码扫码
微信支付:
developers.weixin.qq.com/doc/oplatfo…
// 具体步骤
pay.weixin.qq.com/wiki/doc/ap…
demo