循环通过值事件类型并在 swift 中使用 Firebase 生成值 UIButton 的 titleLabel

Posted

技术标签:

【中文标题】循环通过值事件类型并在 swift 中使用 Firebase 生成值 UIButton 的 titleLabel【英文标题】:Cycling through value event types and making value UIButton's titleLabel with Firebase in swift 【发布时间】:2016-05-28 11:55:10 【问题描述】:

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

    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。

【问题讨论】:

【参考方案1】:

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

您要做的第一件事是将 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 的顺序,因此最新的title 将位于顶部。

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

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

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

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

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

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]
    

)

【讨论】:

既然要得到你说的前十个数据,我可以使用 .reverse() 方法。那到底去哪儿了?谢谢 这将获取 firebase 中添加或更改的最后 10 个节点,这将是最新的。它们按升序阅读,第一次阅读是最旧的,最后一次阅读是最新的。我相信您希望最新的标题位于顶部(按钮 0),因此 titleArray = titleArray.reverse() 会为您执行此操作。最后读入的内容(最新的)现在将位于数组中的索引 0 处。

以上是关于循环通过值事件类型并在 swift 中使用 Firebase 生成值 UIButton 的 titleLabel的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.3 pod 更新后使用未解析的标识符 Firebase 'FIR'

Swift-闭包使用及解决循环引用问题

在 Swift 中使用 UIScrollView 进行无限循环滚动

如何为自定义 UIControl 添加触摸事件并在 swift 5 中确定触摸的项目

如何保存响应 JSON 数组并在 swift 中使用用户默认值进行检索

错误:无法将“[String]”类型的值分配给 swift 中的“String”类型