gpt4 book ai didi

ios - 循环遍历值事件类型并使用 Firebase 快速创建值 UIButton 的 titleLabel

转载 作者:行者123 更新时间:2023-11-29 00:57:22 25 4
gpt4 key购买 nike

在我的应用程序内部,我似乎遇到了错误。不是运行时错误或错误,而是无法弄清楚如何做某事或去哪里做。在我的应用程序的一部分中,用户可以使用 swift 中的 firebase 引用将数据发布到我的 firebase。在另一部分,我遇到困难的地方是如何不仅读取数据,而且组织数据。我在 View Controller 上有一个包含十个 UIButton 的列表,我试图拥有它,以便每次使用 Firebase 的方法 .observeEventType(.Value, withBlock: { snapshot in }) 更改值时捕获 snapshot.value 然后使用 as! String 然后制作最新数据,我的第一个 UIButton 的标题和第二个 UIButton 的标题是旧的第一个 Unbutton 的标题等,直到第九个 UIButton 的标题是第十个,第十个被忽略。基本上是基于 Firebase 的十个最新帖子的 UIButton 标题的循环。任何帮助都会很棒,我希望这对其他人有帮助!谢谢!下面是对代码的尝试:

    override func viewDidLoad() {

super.viewDidLoad()

// firebase reference is defined

// UIButtons deck1 - deck10 are defined

refName.observeEventType(.Value, withBlock: { snapshot in

// however all that happens is that only the first UIButton's title is updated with the new data ( snapshot.value as! String )

self.deck10.titleLabel!.text! = self.deck9.titleLabel!.text! // backwards attempt so values do not overlap

self.deck9.titleLabel!.text! = self.deck8.titleLabel!.text!

self.deck8.titleLabel!.text! = self.deck7.titleLabel!.text!

self.deck7.titleLabel!.text! = self.deck6.titleLabel!.text!

self.deck6.titleLabel!.text! = self.deck5.titleLabel!.text!

self.deck5.titleLabel!.text! = self.deck4.titleLabel!.text!

self.deck4.titleLabel!.text! = self.deck3.titleLabel!.text!

self.deck3.titleLabel!.text! = self.deck2.titleLabel!.text!

self.deck2.titleLabel!.text! = self.deck1.titleLabel!.text!

self.deck1.titleLabel!.text! = snapshot.value as! String

})
}

顺便说一下,用户只是将字符串发布到 firebase 但为了安全起见,最好使用 snapshot.value as? String 判断是否为字符串,否则返回nil。

最佳答案

我想这就是你所追求的......

您要做的第一件事是将 Firebase 中的最后 10 个(最新)值加载到一个数组中。该数组将用于填充和维护您的按钮标题。您还希望在数组中保留对按钮的引用。其中一些不在我的脑海中,所以不要复制粘贴!

var titleArray = [String]()
var buttonArray = [NSButton]() //populate this with 10 button references

titlesRef.queryLimitedToLast(10).observeSingleEventOfType(.Value, withBlock : {
snapshot in

for child in snapshot.children {
let title = child.value["title"] as! String
self.titleArray.append(title)
}

//data will be ascending, newest at the bottom, reverse that
self.titleArray = self.titleArray.reverse()

for index in 0...9
self.buttonArray[index].title = self.titleArray[index] as! String
}
})

然后向您的节点添加一个观察者,它将通知您最新添加的标题。

titlesRef.queryLimitedToLast(1).observeEventType(.ChildAdded, withBlock : {
snapshot in

let title = snapshot.value["title"] as! String

//always add the most current at the 'top' of the array
titleArray(title, atIndex: 0)

//remove the oldest index
titleArray.removeAtIndex(titleArray.count)

//iterate over the buttonsArray and update their titles
})

棘手的一点是 Firebase .Value 将按升序排列,这意味着最旧的标题将是第一个读入的,最新的标题将是最后一个。我们使用 .reverse() 来反转 titlesArray 的顺序,因此最新的标题将位于顶部。

从那时起,我们将观察添加到 Firebase 的最新标题,将其读入并将其插入到数组顶部,然后刷新按钮标题,弹出最后一个(最旧的)标题。

另一种选择是:您可以不观察最后添加的标题并插入它

titlesRef.queryLimitedToLast(10).observeEventType(.Value...

其中,当最后 10 个更改将全部读入时。然后您可以迭代它(反向!)并更新您的按钮。这实际上可能是更少的代码,但它正在读取更多数据。

编辑:这实际上可能是更好的选择。这是代码

titlesRef.queryLimitedToLast(10).observeEventType(.Value, withBlock : { snapshot in

for child in snapshot.children {
let title = child.value["title"] as! String
titleArray.append(title)
}

titleArray = titleArray.reverse()

for index in 0...9 {
let title = titleArray[index]
self.buttonArray[index].title = titleArray[index]
}

})

关于ios - 循环遍历值事件类型并使用 Firebase 快速创建值 UIButton 的 titleLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37498670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com