Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS应用程序在返回应用程序时显示以前的值_Ios_Swiftui - Fatal编程技术网

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

iOS应用程序在返回应用程序时显示以前的值,ios,swiftui,Ios,Swiftui,我不熟悉iOS编程(有很强的Java背景)。我使用xcode11和swift5.1为ios13启动了一个简单的应用程序。我只需要用户在单页应用程序上输入主机和端口,就是这样(使用测试按钮发送JSON请求) 出于某种原因,无论是在模拟器上还是在我的手机上,在更改文本字段中的值后,关闭(单击主页按钮),然后在应用程序上返回显示旧的(原始)值。但不知何故,绑定值(在UserDefaults中)是正确的。test()方法使用最后一个输入值(以及应用程序共享扩展名)。 我尽量使事情尽可能简单: impor

我不熟悉iOS编程(有很强的Java背景)。我使用xcode11swift5.1ios13启动了一个简单的应用程序。我只需要用户在单页应用程序上输入主机和端口,就是这样(使用测试按钮发送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)
    }
}
现在,当我按下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
        }
    }
}