arrays - UITableViewCell 如何知道要从数组或字典加载什么 JSON

标签 arrays json swift uitableview dictionary

假设我有一个由 3 个 JSON 字典组成的数组,每个字典都有自己的类型(演示、条目、评论)。

[
{
    "_id": "random ID",
    "profile": "random ID Profile",
    "demo": {
        "_id": "random ID",
        "profile": {
            "_id": "random ID",
            "name": "name",
            "username": "username",
            "description": "description",
            "picture": "/picture"
        },
        "path": "/path",
        "created": "date"
    },
    "type": "demo",
    "source": "570aa8f647a70780a7111e91",
    "__v": 0,
    "created": "date"
},
{
    "_id": "random ID",
    "comment": "random comment ID",
    "type": "comment",
    "source": "57077c4e356c10371ca91ad9",
    "__v": 0,
    "created": "date"
},
{
    "_id": "random ID",
    "entry": "random entry ID",
    "type": "entry",
    "source": "57077c4e356c10371ca91ad9",
    "__v": 0,
    "created": "date"
}
]

现在我正在检查请求中的类型,因此我只获得演示。

    func getTimeline(urlString: NSURL, completion: ([ModelDemos]) -> Void) {
    Alamofire.request(.GET, urlString).responseJSON { response in

        if let httpResponse = response.response {
            switch httpResponse.statusCode {
            case 200:
                var modelTimeline = [ModelDemos]()

                if let demos = response.result.value as? [JSONDictionary] {
                    for demo in demos {
                        if let type = demo["type"] as? String {
                            if type == "demo" {
                                if let demo = demo["demo"] as? JSONDictionary {
                                    let JSON = ModelDemos(data: demo)
                                    modelTimeline.append(JSON)
                                }
                            }
                        }
                    }
                } else { print("not working") }

                dispatch_async(dispatch_get_main_queue()) {
                    completion(modelTimeline)
                    print("Am I back on the main thread ? Response: \(NSThread.isMainThread())")
                }
            default:
                return
            }
        }
    }
}

在我的 TimelineViewController 中设置完成方法之后

var timelineDemos = [ModelDemos]()

func runApiManagerTimeline() {
    guard let urlString = urlString else {return}
    apiManagerCurrentUserProfile.getTimeline(urlString, completion: didGetCurrentUserProfileDemos)
}

func didGetCurrentUserProfileDemos(demos: [ModelDemos]) {
    timelineDemos = demos
    timelineCollectionView.reloadData()
}

一切正常,我只获得演示词典,并且可以将其加载到 DemoUITableViewCell。

现在我必须为数组中的每个字典创建 3 种不同类型的 UITableViewCell。将其想象为一个 Facebook feed,其中每个词典都是不同的,并且数量在不断增长。

我如何告诉每个单元格应该加载什么内容?

最佳答案

这是使用自定义结构作为数据源数组模型的另一个好例子。

首先创建一个enum以将String类型映射到enum情况

enum DataType : String { case Demo = "demo", Comment = "comment", Entry = "entry" }

创建自定义struct项作为数据源模型。声明三种数据类型的所有公共(public)属性不带初始值,单独属性初始值以使用隐式成员初始化器创建Item 实例并根据类型为各个属性分配值。示例属性来自 JSON,只是一个示例

struct Item {
  // common properties
  var type : DataType
  var source : String
  var created : String

  // individual properties
  var username = ""
  var description = ""
  var picture = ""
}

在TableView Controller 中创建数据源数组

var modelTimeline = [Item]()

并在解析 JSON 时创建 Item 实例

...
if let demos = response.result.value as? [JSONDictionary] {
  for demo in demos {
    if let type = demo["type"] as? String {
      let source = type["source"] ?? ""
      let created = type["date"] ?? ""
      var item = Item(type: DataType(rawValue:type), source: source, created: created)
      if type == "demo" {
        if let demo = demo["demo"] as? JSONDictionary, profile = demo["profile"] as? JSONDictionary {
          item.username = profile["username"] ?? ""
          item.description = profile["description"] ?? ""
          item.picture = profile["picture"] ?? ""
        }
      }
      modelTimeline.append(item)
    }
  }
} else { print("not working") }
...

cellForRowAtIndexPath 中创建单元格并根据类型为 UI 元素分配值

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let item = modelTimeline[indexPath.row]
  switch item.type {
    case .Demo:
    let cell = tableView.dequeueReusableCellWithIdentifier("DemoCell", forIndexPath: indexPath) as! DemoUItableViewCell
    cell.usernameLabel.text = item.username
    cell.descriptionLabel.text = item.description
    cell.sourceLabel.text = item.source
    // populate other UI elements
    return cell

    case .Comment:
    cell = tableView.dequeueReusableCellWithIdentifier("CommentCell", forIndexPath: indexPath)  as! CommentUItableViewCell
    cell.sourceLabel.text = item.source
    // populate other UI elements
    return cell

    case .Entry:
    cell = tableView.dequeueReusableCellWithIdentifier("EntryCell", forIndexPath: indexPath)  as! EntryUItableViewCell
    cell.sourceLabel.text = item.source
    // populate other UI elements
    return cell
  }
}

该代码不是完整的工作版本,它只是建议如何针对不同类型使用不同的单元格。

关于arrays - UITableViewCell 如何知道要从数组或字典加载什么 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36791392/

相关文章:

javascript - 每个数组值旁边的删除按钮

ios - Expo XDE 项目有问题

swift & Firebase : Detect revoked token

ios - 在 iOS 上禁用下拉控制/通知中心

arrays - 在 VBA 中使用数组进行调试

arrays - 在数组 Swift 3 中查找匹配元素

python - 在python中将两个数组合并成一个矩阵并排序

java - 从 mySql 数据库调用时,JSON 返回 NullPointerException

php - 从 mysql 读取数据时,php 代码没有 json 输出

ios - 在 IOS 中从蜂窝网络获取纬度和经度