iOS应用程序在返回应用程序时显示以前的值
我不熟悉iOS编程(有很强的Java背景)。我使用xcode11和swift5.1为ios13启动了一个简单的应用程序。我只需要用户在单页应用程序上输入主机和端口,就是这样(使用测试按钮发送JSON请求) 出于某种原因,无论是在模拟器上还是在我的手机上,在更改文本字段中的值后,关闭(单击主页按钮),然后在应用程序上返回显示旧的(原始)值。但不知何故,绑定值(在UserDefaults中)是正确的。test()方法使用最后一个输入值(以及应用程序共享扩展名)。 我尽量使事情尽可能简单:iOS应用程序在返回应用程序时显示以前的值,ios,swiftui,Ios,Swiftui,我不熟悉iOS编程(有很强的Java背景)。我使用xcode11和swift5.1为ios13启动了一个简单的应用程序。我只需要用户在单页应用程序上输入主机和端口,就是这样(使用测试按钮发送JSON请求) 出于某种原因,无论是在模拟器上还是在我的手机上,在更改文本字段中的值后,关闭(单击主页按钮),然后在应用程序上返回显示旧的(原始)值。但不知何故,绑定值(在UserDefaults中)是正确的。test()方法使用最后一个输入值(以及应用程序共享扩展名)。 我尽量使事情尽可能简单: impor
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)
}
}
现在,当我按下home(主页)按钮时,我在控制台上不断收到以下错误|警告|调试消息。并不是说双击并杀死后台应用程序会让应用程序重新加载正确的值:
2019-10-29 10:07:33.880779+0100 Send2Kodi[1929:114121]找不到支持键盘iPhone肖像Choco NumberPad类型11的键盘平面;使用25671_Choco_iPhone-Simple-Pad_默认值
2019-10-29 10:07:48.956270+0100 Send2Kodi[1929:114121]无法结束后台任务:不存在标识符为2(0x2)的后台任务,或者它可能已经结束。中断UIApplicationEndBackgroundTaskError()以进行调试
2019-10-29 10:07:51.663279+0100 Send2Kodi[1929:114121][Snapshotting]对至少一次未渲染的视图(0x10623e8b0,_UIReplicantView)进行快照需要在屏幕更新后进行:是
当场景进入背景时,是否需要手动执行任何操作?苹果博士似乎暗示一切都是神奇的。请注意,int和string字段的这种行为是相同的。它似乎与代理值变量无关。我不理解您的问题。将应用程序背景化对内存中的值没有任何影响,您似乎知道这一点。那么怎么了?返回应用程序会在文本框中显示更改前的值,与我第一次进入应用程序时的值相同。这就像:1)打开新应用->值为80 2)将val更改为8080 3)后台应用4)再次打开应用5)显示值为80(但在用户默认值中为8080)
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
}
}
}