ios - (线程 1:致命错误)如果没有从 firebase 检索到数据,如何使 UIButton 停止工作
问题描述
我正在开发一个应用程序,该应用程序向用户询问他们始终关注的 4 个用户的问题,然后向选定的用户发送通知:
我的问题是,如果用户关注的人少于 4 人,我会收到一条错误消息,内容为“线程 1:致命错误:索引超出范围” - 我尝试添加以下内容:
self.currIds.append(thisUserKey)
if namesRemaining == 0 {
self.currNames = names
self.optionA.isEnabled = false
self.optionB.isEnabled = false
self.optionC.isEnabled = false
self.optionD.isEnabled = false
为了使按钮在没有加载用户但它不起作用的情况下停止工作。我怎样才能让按钮停止工作并阅读“添加更多朋友”
这是我的代码:
@IBOutlet weak var optionA: UIButton!
@IBOutlet weak var optionB: UIButton!
@IBOutlet weak var optionC: UIButton!
@IBOutlet weak var optionD: UIButton!
var user: UserModel?
var ref: DatabaseReference = Database.database().reference()
var currNames: [String] = []
var currIds: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
getFourRandomNodesAndPrintUserName()
}
@IBAction func answerPressed(_ sender: UIButton) {
if sender.tag == 1 {
print(currNames[0])
print(currIds[0])
} else if sender.tag == 2 {
print(currNames[1])
print(currIds[1])
} else if sender.tag == 3 {
print(currNames[2])
print(currIds[2])
} else if sender.tag == 4 {
print(currNames[3])
print(currIds[3])
}
loadNewQuestion()
}
func getFourRandomNodesAndPrintUserName() {
self.currNames = []
self.currIds = []
var myKeyArray = [String]()
guard let uid = Auth.auth().currentUser?.uid else {
return
}
let ref = self.ref.child("following").child(uid)
//retreives all nodes in the user_keys node
ref.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot.children.allObjects)
for child in snapshot.children { //build the array of keys
let snap = child as! DataSnapshot
let key = snap.key
myKeyArray.append(key)
}
var randomKeyArray = [String]()
let numFollowers = min(4, myKeyArray.count)
for _ in 0..<numFollowers { //will iterate four times
let count = myKeyArray.count //get the number of elements
let randomInt = Int.random(in: 0..<count) //get a random index for the array
let randomUserKey = myKeyArray[randomInt]
randomKeyArray.append(randomUserKey)
myKeyArray.remove(at: randomInt) //remove that object so it's not selected again
}
let numberOfKeys = randomKeyArray.count
var namesRemaining = numberOfKeys
var names = [String]()
var image = [String]()
for i in 0..<numberOfKeys {
let thisUserKey = randomKeyArray[i]
let userRef = self.ref.child("users").child(thisUserKey)
userRef.observeSingleEvent(of: .value, with: { snapshot in
let name = snapshot.childSnapshot(forPath: "fullname").value as! String
let pinionImage = snapshot.childSnapshot(forPath: "profileImageUrl").value as! String
// let image = same as above with "profileImageURL"
print(name)
print(pinionImage)
namesRemaining -= 1
names.append(name)
image.append(pinionImage)
// Another array for images
self.currIds.append(thisUserKey)
if namesRemaining == 0 {
self.currNames = names
self.optionA.isEnabled = false
self.optionB.isEnabled = false
self.optionC.isEnabled = false
self.optionD.isEnabled = false
self.optionA.setTitle(names[0], for: .normal)
self.optionB.setTitle(names[1], for: .normal)
self.optionC.setTitle(names[2], for: .normal)
self.optionD.setTitle(names[3], for: .normal)
}
})
}
})
}
我还尝试编辑代码,以便如果用户关注 3 人或更少的人,按钮应显示“关注更多朋友!” 但如果后面有 4 个或更多,它应该说出用户的姓名,但第二部分似乎不起作用:
self.currIds.append(thisUserKey)
if namesRemaining <= 3 {
self.optionA.setTitle("Follow more friends!", for: .normal)
self.optionB.setTitle("Follow more friends!", for: .normal)
self.optionC.setTitle("Follow more friends!", for: .normal)
self.optionD.setTitle("Follow more friends!", for: .normal)
} else if namesRemaining >= 4 {
self.currNames = names
self.optionA.setTitle(names[0], for: .normal)
self.optionB.setTitle(names[1], for: .normal)
self.optionC.setTitle(names[2], for: .normal)
self.optionD.setTitle(names[3], for: .normal)
}
提前致谢
解决方案
创建一个插座集合并将所有按钮连接到它
@IBOutlet weak var allOptions: [UIButton]! // tags 0,1,2,3
当您收到新的问题详细信息时
allOptions.forEach { $0.isHidden = $0.tag >= newAnswers.count }
并创建一个模型而不是 2 个数组
struct Root {
let name:String
let id:Int
}
然后
var newAnswers = [Root]()
@IBAction func answerPressed(_ sender: UIButton) {
print(newAnswers[sender.tag].name)
print(newAnswers[sender.tag].id)
}
如果没有相关信息,则不应显示该按钮
推荐阅读
- javascript - 为首屏 DOM 元素初始化 JavaScript 的最佳实践
- android - 我想在 kivy 中使用 Android 默认的后退按钮
- svg - 以 xamarin 形式渲染 svg 导致黑色方块
- ios - hidesBottomBarWhenPushed 推送时奇怪的动画行为
- mongodb - MongoDB + Mongo-Express docker-compose 导致 MongoError: Authentication failed
- java - 在 Azure 中部署时 Java SpringBoot 构建失败 - 无法执行目标 com.microsoft.azure:azure-webapp-maven-plugin:1.1.0:deploy
- c# - 我可以得到其他语言的“YYYY-MM-DD”字符串吗?
- android - 禁用时无法正确设置 TextInputLayout 和 TextInputEditText 样式
- c# - 在没有 MQ 客户端的情况下使用 XMS .Net 连接到 MQ
- r - 如何根据 dplyr 中每组的行数将前“n”个元素添加到数据框中