展开 Tableview 部分。检查部分是否展开的问题
Expanding Tableview sections . Issue with checking if section is expanded or not
我主要是想制作一个可扩展的 UITableview 我有两个不同的数据模型(添加帖子)和(reviewPosts)我创建了一个结构来容纳这两个,然后我使用计算 属性 到 return 我这两个模型,以便我可以提供我的 tableview 数组。我已将所有逻辑设置为隐藏和显示部分,但是在设置变量 isExpanded 时我不能,因为我计算的 var 是只读的。我不确定如何设置 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..
来做到这一点
您的 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]()
}
}
我主要是想制作一个可扩展的 UITableview 我有两个不同的数据模型(添加帖子)和(reviewPosts)我创建了一个结构来容纳这两个,然后我使用计算 属性 到 return 我这两个模型,以便我可以提供我的 tableview 数组。我已将所有逻辑设置为隐藏和显示部分,但是在设置变量 isExpanded 时我不能,因为我计算的 var 是只读的。我不确定如何设置 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..
来做到这一点您的 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]()
}
}