【问题标题】:Why is Text Editor variable different from Text Field variable SwiftUI?为什么文本编辑器变量与文本字段变量 SwiftUI 不同?
【发布时间】:2023-02-21 07:53:13
【问题描述】:
import SwiftUI
import Foundation

func readLocalFile(forName name: String) -> Data? {
    do {
        if let bundlePath = Bundle.main.path(forResource: name,
                                             ofType: "json"),
           let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8) {
            return jsonData
        }
    } catch {
        print(error)
    }
    
    return nil
}

func serialization(data: Data) -> [String: String]? {
    let json = try! JSONSerialization.jsonObject(with: data, options: []) as? [String: String]
    return json
}

struct MainView: View {
    
    
    
    
    @State var takeInput: String = ""
    @State var textFieldArray: [String.SubSequence] = []
    @State var finalValues: [String] = []
    @State var showSheet: Bool = false
    
    
    
    
    
    
    var body: some View {
        let localData = readLocalFile(forName: "json_data")
        let dictionarydude = serialization(data: localData!)!
        
        
        let keys = dictionarydude.map{$0.key}
        
        VStack{
            TextField("Type details from your dream here", text: $takeInput)
            HStack{
            Button(action:{
                saveText()
                iterateText(keyParam: keys)
                showSheet.toggle()
                
            }, label: {
                Text("Submit".uppercased())
                    .font(.headline)
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            })
                
                Button(action:{
                    takeInput = ""
                    textFieldArray = []
                    finalValues = []
                }, label: {
                    Text("Reset".uppercased())
                        .font(.headline)
                        .foregroundColor(.white)
                        .padding()
                        .background(Color.gray)
                        .cornerRadius(10)
                })
            }
        }
        .sheet(isPresented: $showSheet, content: {
            NextScreen(finalValues: finalValues, dictionarydude: dictionarydude)
        })
    }
    
    func iterateText(keyParam: [String]) {
        for i in textFieldArray{
            for dictkey in keyParam{
                if i.lowercased() == dictkey.lowercased(){
                    finalValues.append(dictkey)
                }
            }
        }
    }
    
    func saveText(){
        textFieldArray = Array(Set(takeInput.split(separator: " ")))
        takeInput = ""
    }

}

struct NextScreen: View {
    let finalValues: [String]
    let dictionarydude: [String: String]
    var body: some View{
        if finalValues.count > 0{
            NavigationView{
            ScrollView{
                VStack(alignment: .center, spacing: 20){
                    ForEach(finalValues, id: \.self) { index in
                        DisclosureGroup(content:{
                            
                            Text(dictionarydude[index]!)
                                .fontWeight(.bold)
                                .multilineTextAlignment(.leading)
                        },label:{
                            Text(index)
                                .font(.largeTitle)
                        })
                        .padding()
                    }
                }
                .navigationTitle("Meanings")
            }
            }
        }else{
            Text("Oops...")
                .font(.largeTitle)
                .fontWeight(.bold)
                .padding(10)
            Text("Your dream didn't contain any words with significant meanings")
                .italic()
                .fontWeight(.light)
        }
        
    }
}
import SwiftUI
import Foundation

func readLocalFile(forName name: String) -> Data? {
    do {
        if let bundlePath = Bundle.main.path(forResource: name,
                                             ofType: "json"),
           let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8) {
            return jsonData
        }
    } catch {
        print(error)
    }
    
    return nil
}

func serialization(data: Data) -> [String: String]? {
    let json = try! JSONSerialization.jsonObject(with: data, options: []) as? [String: String]
    return json
}

struct MainView: View {
    
    
    
    
    @State var takeInput: String = ""
    @State var textFieldArray: [String.SubSequence] = []
    @State var finalValues: [String] = []
    @State var showSheet: Bool = false
    
    
    
    
    
    
    var body: some View {
        let localData = readLocalFile(forName: "json_data")
        let dictionarydude = serialization(data: localData!)!
        
        
        let keys = dictionarydude.map{$0.key}
        
        VStack{
            TextEditor(text: $takeInput)
            HStack{
            Button(action:{
                saveText()
                iterateText(keyParam: keys)
                showSheet.toggle()
                
            }, label: {
                Text("Submit".uppercased())
                    .font(.headline)
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            })
                
                Button(action:{
                    takeInput = ""
                    textFieldArray = []
                    finalValues = []
                }, label: {
                    Text("Reset".uppercased())
                        .font(.headline)
                        .foregroundColor(.white)
                        .padding()
                        .background(Color.gray)
                        .cornerRadius(10)
                })
            }
        }
        .sheet(isPresented: $showSheet, content: {
            NextScreen(finalValues: finalValues, dictionarydude: dictionarydude)
        })
    }
    
    func iterateText(keyParam: [String]) {
        for i in textFieldArray{
            for dictkey in keyParam{
                if i.lowercased() == dictkey.lowercased(){
                    finalValues.append(dictkey)
                }
            }
        }
    }
    
    func saveText(){
        textFieldArray = Array(Set(takeInput.split(separator: " ")))
        takeInput = ""
    }

}

struct NextScreen: View {
    let finalValues: [String]
    let dictionarydude: [String: String]
    var body: some View{
        if finalValues.count > 0{
            NavigationView{
            ScrollView{
                VStack(alignment: .center, spacing: 20){
                    ForEach(finalValues, id: \.self) { index in
                        DisclosureGroup(content:{
                            
                            Text(dictionarydude[index]!)
                                .fontWeight(.bold)
                                .multilineTextAlignment(.leading)
                        },label:{
                            Text(index)
                                .font(.largeTitle)
                        })
                        .padding()
                    }
                }
                .navigationTitle("Meanings")
            }
            }
        }else{
            Text("Oops...")
                .font(.largeTitle)
                .fontWeight(.bold)
                .padding(10)
            Text("Your dream didn't contain any words with significant meanings")
                .italic()
                .fontWeight(.light)
        }
        
    }
}

大家好。对不起,我知道这是很多代码,但我真的没有办法让它更小。这两部分中唯一不同的是包含 TextField 和 TextEditor 的行。问题是 TextField 版本有效并在 picture 中给出结果,如果我只输入单词测试,而 TextEditor 将一个空数组传递到 NextScreen 工作表中,因此触发工作表内部的其他内容,如图所示@ 987654322@。如果我向下滑动工作表并将新文本提交到 TextEditor 中而不停止并再次运行代码,它会工作并且数组中的旧输入也会显示出来。在这种情况下,我宁愿有一个 TextEditor,因为我需要多行,而不仅仅是一行,这就是我一直试图改变它的原因。老实说,我不知道为什么这不起作用,我已经遍历了每个变量并打印了它们,唯一一次任何东西都显示为空数组并且与我使用 TextField 时不同的是它被传递到工作表时.我想我只需要知道是否有人知道 TextField 和 TextEditor 之间可能导致这种情况的任何差异,因为我花了几个小时试图找到表明它们行为不同但我找不到任何东西的东西。

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    我认为这是 .sheet 的 isPresented 版本中的一个错误,并且在其他地方进行了讨论。使用 .sheet(item: onDismiss:) 修饰符来防止我称之为“空白表错误”。当需要工作表时,item 从 nil 更改为 NextSheet 数据。

    所以我的猜测(我没有尝试过任何东西,但在我自己的代码中遇到了类似的问题)是你可以

    @State var showSheet : [String]? = nil
    

    让按钮制作

    showSheet = finalValue
    

    然后使用

    .sheet(item: $showSheet) { screenValues in 
        NextScreen(finalValues: screenValues, dictionarydude: dictionarydude) 
    }
    

    当工作表被关闭时,这会将 showSheet var 改回 nil。

    【讨论】:

      猜你喜欢
      • 2020-08-14
      • 1970-01-01
      • 2015-04-20
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多