多细胞类型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]
    
    // ..

ItemAItemB 类型的所有项目都可以符合协议,比如 Item

protocol Item 


class ItemA: Item 
class ItemB: Item 

【讨论】:

以上是关于多细胞类型swift 4.2的主要内容,如果未能解决你的问题,请参考以下文章

单细胞SingleR鉴定细胞类型

Swift 4.2 类型“NSAttributedString.Key”没有成员“accessibilitySpeechPitch”

swift 4.2 无法将类型“(_)-> Void”的值转换为预期的参数类型“(()-> Void)?”

使用 PromiseKit 6 在 Swift 4.2 中缓存

玩转单细胞高级分析 单细胞富集分析篇

Swift 4.2 UIDocumentBrowser View Controller Powerpoint PPTX 文件灰显