gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:29:04 25 4
gpt4 key购买 nike

假设我有一个由 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com