循环使用值事件类型,并使用Firebase在swift中创建值UIButton的titleLabel

时间:2016-05-28 11:55:10

标签: ios iphone swift uibutton firebase

在我的应用程序内部,我似乎遇到了错误。不是运行时错误或错误,而是无法弄清楚如何做某事或在哪里使用它。在我的应用程序的一部分中,用户可以使用swift中的firebase引用将数据发布到我的firebase。另一方面,我遇到困难的是,不仅要读取数据,还要组织它。我在视图控制器上有一个十个UIButton的列表,我试图让它每次使用Firebase的方法.observeEventType(.Value, withBlock: { snapshot in })更改值以捕获snapshot.value然后向下转换它作为使用as! String的字符串然后制作,最新的数据,我的第一个UIButton的标题和我的第二个UIButton的标题是旧的第一个解开按钮的标题等,直到第九名UIButton的头衔是第十名,第十名被忽略。基本上是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。

1 个答案:

答案 0 :(得分: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的顺序,以便最新的标题位于顶部。

从那时起,我们观察添加到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]
    }

})