Swift UITableView每个Nth Cell不同

时间:2017-11-30 12:54:04

标签: ios swift uitableview insert cell

我试图在每第n个(第3个)单元格中显示不同的单元格(Ad)。 像这样:

"Request"
"Request"
"Request"
"Ad"
"Request"
"Request"
"Request"
"Ad"
"Request"
"Request"
"Request"
"Ad"
"Request"
...

我的代码:

这些是我的变量

var requests = [RequestListable]()
var list = [Listable]()
var users = [UserInfo?]()
var adInterval = 3

这是我的功能,我正在尝试加载广告。问题是通常每个请求(requestsArray)都有一个关联用户(usersArray),当我将广告插入“listArray”时,用户不再与请求匹配。一点也不。 这就是为什么我在同一个索引处插入一个假冒用户,广告插入到该索引,但这不起作用。

  

我正在重新加载TableView的另一个函数,它取出了我的   请求

func loadAds()
    {
        Api.adApi.observeAds
        {
            (ad, user) in
            self.list = self.requests
            for i in stride(from: self.adInterval, to: self.requests.count, by: self.adInterval).reversed()
            {
                self.list.insert(ad, at: i)
                self.users.insert(user, at: i) // This is probably where i'ts going wrong
                print(self.users.count)  // Returns 40 (Don't know why)
                print(self.list.count) // Returns 13
            }
        }
    }

这些是我的TableView函数

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return list.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let listing = list[indexPath.row]

        if let request = listing as? RequestListable
        {
            let cell = tableView.dequeueReusableCell(withIdentifier: "RequestCell", for: indexPath) as! RequestTVCell
            let user = users[indexPath.row]
            cell.request = request
            cell.user = user
            cell.delegate = self
            return cell
        }
        else if let ad = listing as? AdListable
        {
            let cell = tableView.dequeueReusableCell(withIdentifier: "AdCell", for: indexPath) as! AdTVCell
            cell.ad = ad
            cell.user = users[indexPath.row]
            return cell
        }

        fatalError("Did not find data or ad for cell: Should never get here")
    }

所以问题是:

  

之后,用户与其关联的请求不匹配   插入广告和用户

有什么建议吗?我真的很感激。

2 个答案:

答案 0 :(得分:0)

看起来你有users而不是requests,因为你使用数组的索引来匹配userrequest,这些都不匹配。您有一条评论'Returns 40 (Dont know why) - 您应该弄清楚这一点并确保您的usersrequests匹配。此外,您可能需要考虑更紧密地耦合usersrequests。您可以为list使用元组类型而不是将它们存储在单独的数组中,并添加一个方法以确保user的{​​{1}}正确request,然后您就会知道您对user有正确的request

var list = [(UserInfo, Listable)]()

答案 1 :(得分:0)

每次执行observeAds闭包时,您都会使用self.requests的副本替换self.list,同时始终插入self.users。