我是iOS编程的新手(具有很强的Java背景)。我使用 Xcode 11 和 iOS 13 的 Swift 5.1 启动了一个简单的应用程序。我只需要用户在单页应用程序上输入主机和端口即可,就是这样(带有一个用于发送JSON请求的测试按钮)。
由于某种原因,无论是在模拟器上还是在我的手机上,更改文本字段中的值后,先关闭(单击主屏幕按钮),然后在应用程序上返回均会显示旧的(原始)值。但是以某种方式,绑定值(在UserDefaults中)是正确的。 test()方法使用最后一个输入值(以及应用程序共享扩展名)。 我试图使事情尽可能简单:
import SwiftUI
struct ContentView: View {
@EnvironmentObject var config: MyConfig
@EnvironmentObject var service: MyService
var body: some View {
// proxy the text field String to allow on-the-fly set
let portProxy = Binding<String>(
get: {
print("proxy get \(self.config.port)")
return "\(self.config.port)" },
set: {
print("proxy set \($0)")
if let value = NumberFormatter().number(from: $0) {
self.config.port = value.intValue
}
}
)
return VStack() {
Text(verbatim: "Kodi Settings")
.font(.title)
.fontWeight(.medium)
Divider()
HStack() {
TextField("Host", text: $config.host)
}
Divider()
HStack() {
TextField("Port", text: portProxy)
.keyboardType(.asciiCapableNumberPad)
}
Divider()
Button(action: {
self.service.test()
}) {
Text("Test")
}
Spacer()
}
.padding(.all)
}
}
import SwiftUI
import Combine
final class KodiConfig: ObservableObject {
private enum Keys {
static let host = "host"
static let port = "port"
}
private let defaults: UserDefaults
init(_ defaults: UserDefaults = .standard) {
self.defaults = defaults
defaults.register(defaults: [
Keys.host: "host.local",
Keys.port: 8080
])
}
var host: String {
set { defaults.set(newValue, forKey: Keys.host) }
get { defaults.string(forKey: Keys.host)! }
}
var port: Int {
set {
print("setting port: \(newValue)")
defaults.set(newValue, forKey: Keys.port) }
get {
let ret = defaults.integer(forKey: Keys.port)
print("port is \(ret)")
return ret
}
}
}
现在,当我按下主屏幕按钮时,我会继续在控制台上收到以下错误|警告|调试消息。并非双击并杀死后台应用程序会以正确的值重新加载应用程序:
2019-10-29 10:07:33.880779 + 0100 Send2Kodi [1929:114121]找不到支持键盘iPhone-PortraitChoco-NumberPad的11型键盘;使用25671_PortraitChoco_iPhone-Simple-Pad_Default
2019-10-29 10:07:48.956270 + 0100 Send2Kodi [1929:114121]无法结束BackgroundTask:不存在标识符为2(0x2)的后台任务,或者它可能已经结束。中断UIApplicationEndBackgroundTaskError()进行调试。
2019-10-29 10:07:51.663279 + 0100 Send2Kodi [1929:114121] [Snapshotting]快照至少未渲染一次的视图(0x10623e8b0,_UIReplicantView)需要afterScreenUpdates:YES。
场景进入背景时,是否有任何手动操作?苹果医生似乎暗示一切都是魔术。请注意,对于int和string字段,此行为是相同的。似乎与代理值var无关。