【问题标题】:Expanding Tableview sections . Issue with checking if section is expanded or not扩展 Tableview 部分。检查部分是否扩展的问题
【发布时间】:2019-11-29 04:28:54
【问题描述】:

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

  // 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 header 时设置isExpanded 属性。但是我不确定如何使用 setter 来做到这一点..

【问题讨论】:

    标签: arrays swift computed-properties


    【解决方案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]()
        }
    }
    

    【讨论】:

    • 您好,这是有道理的,但是有了这个实现,我现在收到典型错误“尝试将第 0 行插入第 1 节,但更新后第 1 节只有 0 行”现在我不确定至于他们设置我的数组的方式是否有问题。我可能不得不重新考虑制作可扩展表格视图的策略
    • 是的,重新考虑策略是正确的方法。您可能还会重新考虑静态变量的使用。无论如何,请尽量小心计算属性。您应该始终将进度保存在某个地方。
    • 感谢您的帮助!这真的为我清除了一些东西:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多