扩展Tableview部分。检查部分是否展开的问题

时间:2019-07-20 13:00:00

标签: arrays swift computed-properties

我基本上是想制作一个可扩展的UITableview我有两个不同的数据模型(add posts)和(reviewPosts),我创建了一个结构来容纳这两个模型,然后我使用了计算属性向我返回了这两个模型,以便我可以喂我的tableview数组。我已经设置了所有逻辑来隐藏和显示节,但是在设置变量isExpanded时我不能,因为我的计算变量是只读的。我不确定如何设置newValue(布尔)。

  // class for constructing tableview data

class FeedConstructor {
    public static var feedPosts: [ExpandableItem] {
           var isOpen = true

            return [ExpandableItem(isExpanded: isOpen, items: posts), 
            ExpandableItem(isExpanded: isOpen, items: reviews)]      
         }

    static var posts = [AddPost]()
    static var reviews = [ReviewPost]()

   }


  // here I am trying to set the isExpanded property
  class ViewController: UIViewController {
     func dropDownPressed(sender: UITapGestureRecognizer) {
        guard let section = sender.view?.tag else {return}


        var indexPaths = [IndexPath]()
        for row in FeedConstructor.feedPosts[section].items.indices{
            print(section,row)
            let indexPath = IndexPath(row: row, section: section)
            indexPaths.append(indexPath)
        }

    // I cant set this property because its get only.. 
       let isExpanded = FeedConstructor.feedPosts[section].isExpanded
        FeedConstructor.feedPosts[section].isExpanded = !isExpanded!

        if isExpanded! {
            tableView.deleteRows(at: indexPaths, with: .fade)
        } else {
            tableView.insertRows(at: indexPaths, with: .fade)

        } 
      }
   }

每次选择tableview标头时,都需要能够设置isExpanded属性。但是我不确定如何使用二传手。.

1 个答案:

答案 0 :(得分:-1)

您的feedPosts是一个计算属性。

var feedPosts: [ExpandableItem] {
    var isOpen = true

    return [
        ExpandableItem(isExpanded: isOpen, items: posts),
        ExpandableItem(isExpanded: isOpen, items: reviews)
    ]
}

这意味着每次您获得ExpandableItem数组时,您都会创建一个新数组。这意味着每个isExpanded将是true,因为每个新的isOpen = true都使用ExpandableItem。即使您能够更改isExpanded,您也会因为没有保存ExpandableItem数组而失去进度,因为它是一个计算属性。

解决方案是:您的ExpandableItem数组不应该是计算属性:

class FeedConstructor {

    public static var feedPosts: [ExpandableItem] = {
        var isOpen = true
        return [
            ExpandableItem(isExpanded: isOpen, items: postsIntial),
            ExpandableItem(isExpanded: isOpen, items: reviewsInitial)
        ]
    }()

    private static var postsIntial: [AddPost] {
        return [AddPost]()
    }
    private static var reviewsInitial: [ReviewPost] {
        return [ReviewPost]()
    }
}