UiTableView以编程方式按部分组织项目

时间:2017-02-07 03:52:04

标签: ios swift xcode uitableview sections

我尝试根据用户的位置对用户进行分组。 例如,纽约市的任何人都应该在桌面视图的NYC部分,洛杉矶的任何人都应该在该部分之下。

//Sets up the sections
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    //Sets the header view
    guard let header = view as? UITableViewHeaderFooterView
        else {
            return
    }

    //Sets the properties.
    view.tintColor = ChatMessageCell.indexedColor
    header.textLabel?.textColor = UIColor.white
    header.textLabel?.font = UIFont(name: "Open Sans Bold", size: 11)
    header.backgroundColor = ChatMessageCell.indexedColor
    header.textLabel?.textAlignment = .center

    //Sets the variable headerText = to the text labels header
    self.headerText = header.textLabel?.text!

}

我创建了一个名为headerText的变量,用于存储标题的文本标签。 在numberOfRowsInSection中,我将用户的位置与标题标题进行比较。如果匹配,我会返回用户,但如果不匹配,则不返回任何内容

//Sets the number of rows equal to the amount of Users.
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    //Observes the users (Firebase
    refHandle = ref.child("Users").observe(.childAdded, with: { (snapshot) in

        if let dictionary = snapshot.value as? [String : AnyObject]{
            let user = Users()
            user.id = snapshot.key
            user.setValuesForKeys(dictionary)


            //If statement to see if their location is equal to header it should be under
            //This array is empty + meant to store only the users whose location is equal to the section title
            if user.location == self.headerText{
                return user
            }
            else{
                return 0
            }

        }
    })

}

1 个答案:

答案 0 :(得分:0)

我认为您的代码有两个问题:

  • 要创建/修改标题视图,您应该实施viewForHeaderInSection(而不是在willDisplayHeaderView中执行此操作)
  • 您应该存储某种当前标头的状态数据(如headerText)。这在很大程度上取决于表显示标题和单元格的顺序的Framework实现细节。

因此,您需要使用差异方法来访问分组/标头条件并访问单元格数据。

一个简单的例子:

  • 首先,您将对部分/位置(viewDidLoadviewDidAppear中的某处)进行计算,按字母顺序对它们进行排序,并将它们存储在名为“{1}”的数组中。 locations或某种方式。
  • numberOfRowsInSection中,您会返回位置数量(例如locations.count
  • viewForHeaderInSection中,您将检索所提供部分的数据,例如return locations[section]
  • numberOfRowsInSection中,您将计算对指定部分的用户数量
  • cellForRow中,您将计算然后返回包含用户数据的单元格。