首页 > 解决方案 > (线程 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)
                }

提前致谢

标签: iosswift

解决方案


创建一个插座集合并将所有按钮连接到它

@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)
}

如果没有相关信息,则不应显示该按钮


推荐阅读