多细胞类型swift 4.2
Posted
技术标签:
【中文标题】多细胞类型swift 4.2【英文标题】:Multiple cell type swift 4.2 【发布时间】:2019-03-17 12:12:11 【问题描述】:已解决:我刚刚添加了“for-in”
我希望有人能帮助我。 如何在满足“序列”顺序的情况下显示具有不同元素的单元格。单元格应以任意顺序和任意数量的每个自定义单元格排列。我的意思是第一个单元格应该显示第一个项目类型,第二个单元格 - 第二个项目类型,第三个单元格 - 第一个项目类型,第四个单元格 - 第一个项目。 这取决于来自 json 数据的序列。 我有一个带有下一个结构的 json 文件(检查我需要的序列数组):
"data": [
"name": "first item",
"data":
"text": "first item"
,
"name": "second item",
"data":
"url": "picture.png"
],
"sequence": ["first item", "second item", "first item", "first item"]
我为 json 解析和其他方法创建了我的类:
class MyClass
private let jsonStr = "url adress"
var items = [ModelItem]()
var jsonData: Object!
func jsonParsing(completionHandler: @escaping (([ModelItem], Error?) -> Void))
guard let url = URL(string: jsonStr) else return
URLSession.shared.dataTask(with: url) (data, response, error) in
guard let data = data else DispatchQueue.main.async completionHandler([], error)
return
do
self.jsonData = try JSONDecoder().decode(Object.self, from: data)
DispatchQueue.main.async
if let name = self.jsonData?.data[0].data.text
let firstItem = FirstItemModel(text: name)
self.items.append(firstItem)
if let pictureUrl = self.jsonData?.data[1].data.url
let secondItem = SecondItemModel(pictureUrl: pictureUrl)
self.items.append(secondItem)
DispatchQueue.main.async completionHandler(self.items, nil)
catch
print("Error serializing json:", error)
.resume()
JSON 结构:
struct Object: Decodable
let data: [ArrayModelData]
let sequence: [String]
多种细胞类型的枚举:
enum ModelItemType: String
case firstItem
case secondItem
protocol ModelItem
var type: ModelItemType get
var rowCount: Int get
var sectionTitle: String get
extension ModelItem
var rowCount: Int
return 1
UITableView 方法:
func numberOfSections(in tableView: UITableView) -> Int
return items.count
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return items[section].rowCount
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let item = items[indexPath.section]
switch item.type
case .firstItem:
...
case .secondItem:
...
return UITableViewCell()
【问题讨论】:
我不明白你的问题。在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
中配置单元格,因此您可以在那里决定要显示哪个单元格并控制顺序。
我的意思是我从 json 文件(第二个数组)中获取订单。而且我希望能够在同一个表格视图中使用 2 种不同的单元格类型,但是以随机(或不随机)的顺序。因此,单元格应按任意顺序排列,每个自定义单元格的数量不限。
【参考方案1】:
最好保留一个单独的变量来保存每种类型的项目。
var one: [ItemA]?
var two: [ItemB]?
var seq: [Int] = [1,2,1,1]
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return one.count + two.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let row = indexPath.row
var data: [Item]
if seq[row] == 1
data = one[row]
else
data = two[row]
// ..
ItemA
、ItemB
类型的所有项目都可以符合协议,比如 Item
。
protocol Item
class ItemA: Item
class ItemB: Item
【讨论】:
以上是关于多细胞类型swift 4.2的主要内容,如果未能解决你的问题,请参考以下文章
Swift 4.2 类型“NSAttributedString.Key”没有成员“accessibilitySpeechPitch”
swift 4.2 无法将类型“(_)-> Void”的值转换为预期的参数类型“(()-> Void)?”
使用 PromiseKit 6 在 Swift 4.2 中缓存
Swift 4.2 UIDocumentBrowser View Controller Powerpoint PPTX 文件灰显