Ios 使用Xcode 11 GM seed 2的Firebase SwiftUI-Swift UI Firestore
我遵循了这个教程;然而,对Xcode 11 GM seed 2语法和术语所做的一些更改进行了调整,因为有些东西现在已经过时了。构建成功,但由于某些原因崩溃 我将感谢任何帮助和建议,尝试所有我能想到的尝试和错误 下面是代码(由于GM seed 2有许多命令更改,因此粘贴所有代码):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
导入快捷界面
进口联合收割机
导入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