返回到应用程序时,iOS应用程序显示以前的值

时间:2019-10-29 09:16:22

标签: ios swiftui

我是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无关。

0 个答案:

没有答案