Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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 使用Xcode 11 GM seed 2的Firebase SwiftUI-Swift UI Firestore_Ios_Firebase_Google Cloud Firestore_Swiftui - Fatal编程技术网

Ios 使用Xcode 11 GM seed 2的Firebase SwiftUI-Swift UI Firestore

Ios 使用Xcode 11 GM seed 2的Firebase SwiftUI-Swift UI Firestore,ios,firebase,google-cloud-firestore,swiftui,Ios,Firebase,Google Cloud Firestore,Swiftui,我遵循了这个教程;然而,对Xcode 11 GM seed 2语法和术语所做的一些更改进行了调整,因为有些东西现在已经过时了。构建成功,但由于某些原因崩溃 我将感谢任何帮助和建议,尝试所有我能想到的尝试和错误 下面是代码(由于GM seed 2有许多命令更改,因此粘贴所有代码): 导入快捷界面 进口联合收割机 导入FirebaseFirestore 结构数据集:可识别{ var id=“” var name=“” var phone=“” var services=“” } 类getData:O

我遵循了这个教程;然而,对Xcode 11 GM seed 2语法和术语所做的一些更改进行了调整,因为有些东西现在已经过时了。构建成功,但由于某些原因崩溃

我将感谢任何帮助和建议,尝试所有我能想到的尝试和错误

下面是代码(由于GM seed 2有许多命令更改,因此粘贴所有代码):

导入快捷界面
进口联合收割机
导入FirebaseFirestore
结构数据集:可识别{
var id=“”
var name=“”
var phone=“”
var services=“”
}
类getData:ObservableObject{
var didChange=PassthroughSubject()
变量数据=[dataset](){
迪塞特{
发送(自我)
}
}
init(){
设db=Firestore.Firestore()
let settings=db.settings
settings.AreTimestampsSinSnapshotSenabled=true
db.settings=设置
db.collection(“场所”).addSnapshotListener{(snap,err)在
如果错误!=零{
打印((错误?.localizedDescription)!)
返回
}
用于输入(快照?.documentChanges){
将name=i.document.data()[“name”]设为!字符串
让phone=i.document.data()[“phone”]作为!字符串
让services=i.document.data()[“services”]作为!字符串
设id=i.document.documentID
DispatchQueue.main.async{
self.data.append(数据集(id:id,name:name,phone:phone,services:services))
}
}
}
}
}
结构ContentView:View{
@ObservedObject var data1=getData()
var body:一些观点{
VStack{
文本(“你好,世界”)
列表(data1.data){i in
cellView(名称:i.name,电话:i.phone,服务:i.services)
}
}
}
}
结构单元视图:视图{
@State var name=“”
@State var phone=“”
@State var services=“”
var body:一些观点{
VStack{
文本(名称)
文字(电话)
文本(服务)
}
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}
这些是结果

2019-09-19 20:30:34.724594+0600场馆[16661:712640]-[I-ACS036002]分析屏幕报告已启用。调用+[FIRAnalytics setScreenName:setScreenClass:]设置屏幕名称或覆盖默认屏幕类名。要禁用屏幕报告,请在Info.plist中将标志FirebaseScreenReportingEnabled设置为NO(布尔值)

2019-09-19 20:30:34.975422+0600场馆[16661:712648]5.12.0-[Firebase/Analytics][I-ACS023007]Analytics v.50300000启动

2019-09-19 20:30:34.975634+0600地点[16661:712648]5.12.0-[Firebase/Analytics][I-ACS023008]要启用调试日志记录,请设置以下应用程序参数:-FIRAnalyticsDebugEnabled 无法将类型为“\uu NSCFNumber”(0x10b8a8610)的值强制转换为“NSString”(0x10954f978)

2019-09-19 20:30:35.073897+0600场馆[16661:711704]无法将类型为“\u NSCFNumber”(0x10b8a8610)的值强制转换为“NSString”(0x10954f978)。 (lldb)


正如第一条评论中提到的,类型之间似乎存在强制转换问题

我尝试了同样的例子,并且能够成功地构建和运行,但是屏幕上没有显示任何数据。经过一些调查,我重新编写了部分代码,最终得到了结果

我没有使用视频的数据集,而是使用了以下结构:

  struct Profile : Identifiable {

  var id: Int
  var name: String
  var phoneNumber: String

  init(id: Int, name: String, phoneNumber: String) {
    self.id = id
    self.name = name
    self.phoneNumber = phoneNumber
  }
}
以下是SwiftUI视图:

import SwiftUI
import FirebaseFirestore

struct ContentView: View {

    @State var data1 = [Profile]()

    var body: some View {

        return VStack {
            HStack {
                Text("Penya").font(.largeTitle)
            }
            Divider()
            List(data1) { i in
                cellView(name: i.name, phoneNumber: i.phoneNumber)
            }
        }.onAppear {
            self.getData()
        }
    }


    func getData() {

        var data = [Profile]()

        let db = Firestore.firestore()
        db.collection("patients").addSnapshotListener { (snap, err) in

            if err != nil {
                print((err?.localizedDescription)!)
                return
            }

            for doc in (snap?.documentChanges)! {
                let name = doc.document.data()["name"] as! String
                let phoneNumber = doc.document.data()["phoneNumber"] as! String

                print (name)
                print (phoneNumber)

                DispatchQueue.main.async {
                    data.append(Profile(id: 0,
                                        name: name,
                                        phoneNumber: phoneNumber))
                    self.data1 = data
                }
            }
        }
    }

}

struct cellView : View {

    @State var name = ""
    @State var phoneNumber = ""

    var body: some View {
        VStack {
            Text("Valors:")
            Text(name)
            Text(phoneNumber)
        }
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

无论何时在Firestore中更改记录,都会在模拟器屏幕上自动执行更新。只有一件事我还在做:更新后的值在控制台中正确显示(我包括两个print()),但即使我在Firestore中更改了记录,我也总能在模拟器屏幕上看到相同的原始值。

使用Sergi的代码,但他缺少以下内容:

let id = doc.document.documentID

DispatchQueue.main.async {
                    data.append(Profile(id: id,
                                        name: name,
                                        phoneNumber: phoneNumber))
                    self.data1 = data
并将id的所有值都更改为String而不是Int。

我建议使用 带吊舱“FirebaseFirestoreSwift”

然后,您可以在项目中为Firestore使用纯组合模式

如果出现错误消息“无法将类型为“\uu NSCFNumber”(0x10b8a8610)的值强制转换为“NSString”,则似乎您正在尝试将数字强制转换为字符串,这是不可能的。您的
名称
电话
服务
字段中很可能有一个包含数值。如果你右键点击红色的错误指示器,你应该能够找到那条精确的线。
let id = doc.document.documentID

DispatchQueue.main.async {
                    data.append(Profile(id: id,
                                        name: name,
                                        phoneNumber: phoneNumber))
                    self.data1 = data