如何在 swift 中使用多个部分的骨架加载?
Posted
技术标签:
【中文标题】如何在 swift 中使用多个部分的骨架加载?【英文标题】:How to use skeleton loading with multiple sections in swift? 【发布时间】:2021-06-30 13:29:09 【问题描述】:我想用 tableview 应用骨架动画。为了实现这一点,我正在使用“SkeletonView”cocopods,它在单个部分中运行良好,但是当我尝试使用多个部分时,它会抛出越界错误。即使我不知道从哪里可以找到这个 cocopods 的文档。如果有人有什么想法,请帮助我。
import UIKit
import SkeletonView
class ViewController: UIViewController
@IBOutlet weak var tableView: UITableView!
var data = [[String: Any]]()
override func viewDidLoad()
super.viewDidLoad()
tableView.rowHeight = 80
tableView.estimatedRowHeight = 80
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute:
self.data.append(["day": "Mon",
"record": [
["name": "Abhya"], ["name": "Anivesh"]
]
])
self.data.append(["day": "Tue",
"record": [
["name": "Vivek"], ["name": "Arun"]
]
])
self.data.append(["day": "Wed",
"record": [
["name": "Bindu"], ["name": "Aliya"]
]
])
self.data.append(["day": "Thi",
"record": [
["name": "Vivek"], ["name": "Arun"]
]
])
print(self.data[0])
self.tableView.stopSkeletonAnimation()
self.view.hideSkeleton()
self.tableView.reloadData()
)
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
tableView.isSkeletonable = true
tableView.showAnimatedGradientSkeleton()
tableView.showAnimatedSkeleton(usingColor: .concrete, transition: .crossDissolve(0.25))
func getArray(withDictionary array: Any?) -> [Dictionary<String, Any>]
guard let arr = array as? [Dictionary<String, Any>] else
return []
return arr
extension ViewController:UITableViewDelegate
extension ViewController: SkeletonTableViewDataSource
func numberOfSections(in tableView: UITableView) -> Int
self.data.count
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
let dictionary = self.data[section]
let array = getArray(withDictionary: dictionary["record"])
return array.count
func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier
return "TeacherCell"
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 60
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") as! HeaderTableViewCell
print("section", section)
let dict = self.data[section]
cell.dayName.text = dict["day"] as! String
return cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "TeacherCell") as! TeacherTableViewCell
let dictionary = self.data[indexPath.row]
let array = getArray(withDictionary: dictionary["record"])
let dict = array[indexPath.row]
cell.teacherName.text = dictionary["name"] as! String
return cell
【问题讨论】:
【参考方案1】:我遇到了同样的问题,并在 tableView Cell 中解决了。
在awakeNib()
中添加:someLabel.showAnimatedSkeleton()
然后添加一个自定义函数:
func hideSkeleton()
someLabel.hideSkeleton()
现在在您的 MainView 控制器中,在返回单元格之前在 cellForItem
中调用此函数。
希望这对你有用。
【讨论】:
以上是关于如何在 swift 中使用多个部分的骨架加载?的主要内容,如果未能解决你的问题,请参考以下文章
将一张图像分成多个部分后,如何在 Swift 中使用 UIImage 数组?
Swift - 如何在具有多个部分的 collectionView 上执行 BatchUpdates
如何使用 Swift 按字母顺序将表格视图数据划分为多个部分? (重写)