gpt4 book ai didi

ios - 无法使用 json 数据填充 UITableview

转载 作者:行者123 更新时间:2023-11-28 11:36:28 24 4
gpt4 key购买 nike

我有一个本地 json 文件(你可以找到它 here )。

我正在尝试用这个 json 填充 UITableView,然后我可以生成表格。

但我只能看到提到的标题,而看不到这些标题单元格下方的相应数据。

我将在下面发布一些代码,如果有帮助,我可以分享更多

enum ProfileViewModelItemType {
case nameAndPicture
case about
case email
case friend
case attribute
}

protocol ProfileViewModelItem {
var type: ProfileViewModelItemType { get }
var rowCount: Int { get }
var sectionTitle: String { get }
}

extension ProfileViewModelItem {
var rowCount: Int {
return 1
}
}

class ProfileViewModelNameItem: ProfileViewModelItem {
var type: ProfileViewModelItemType {
return .nameAndPicture
}

var sectionTitle: String {
return "Main Info"
}
}

class ProfileViewModelNameAndPictureItem: ProfileViewModelItem {
var type: ProfileViewModelItemType {
return .nameAndPicture
}

var sectionTitle: String {
return "Main Info"
}

var rowCount: Int {
return 1
}

var pictureUrl: String
var name: String

init(name: String , pictureUrl: String) {
self.name = name
self.pictureUrl = pictureUrl
}
}

class ProfileViewModelAboutItem: ProfileViewModelItem {
var type: ProfileViewModelItemType {
return .about
}

var sectionTitle: String {
return "About"
}
var rowCount: Int {
return 1
}

var about: String

init(about: String) {
self.about = about
}
}

class ProfileViewModelEmailItem: ProfileViewModelItem {
var type: ProfileViewModelItemType {
return .email
}

var sectionTitle: String {
return "Email"
}
var rowCount: Int {
return 1
}
var email: String

init(email: String) {
self.email = email
}
}

class ProfileViewModelAttributeItem: ProfileViewModelItem {
var type: ProfileViewModelItemType {
return .attribute
}

var sectionTitle: String {
return "Attributes"
}

var rowCount: Int {
return attributes.count
}

var attributes: [Attribute]

init(attributes: [Attribute]) {
self.attributes = attributes
}
}

class ProfileViewModeFriendsItem: ProfileViewModelItem {
var type: ProfileViewModelItemType {
return .friend
}

var sectionTitle: String {
return "Friends"
}

var rowCount: Int {
return friends.count
}

var friends: [Friend]

init(friends: [Friend]) {
self.friends = friends
}
}

class ProfileViewModel: NSObject {
var items = [ProfileViewModelItem]()

override init() {
super.init()
guard let data = dataFromFile("ServerData"), let profile = Profile(data: data) else {
return
}

if let name = profile.fullName, let pictureUrl = profile.pictureUrl {
let nameAndPictureItem = ProfileViewModelNameAndPictureItem(name: name, pictureUrl: pictureUrl)
items.append(nameAndPictureItem)
}

if let about = profile.about {
let aboutItem = ProfileViewModelAboutItem(about: about)
items.append(aboutItem)
}

if let email = profile.email {
let dobItem = ProfileViewModelEmailItem(email: email)
items.append(dobItem)
}

let attributes = profile.profileAttributes
// we only need attributes item if attributes not empty
if !attributes.isEmpty {
let attributesItem = ProfileViewModelAttributeItem(attributes: attributes)
items.append(attributesItem)
}

let friends = profile.friends
// we only need friends item if friends not empty
if !profile.friends.isEmpty {
let friendsItem = ProfileViewModeFriendsItem(friends: friends)
items.append(friendsItem)
}
}
}

extension ProfileViewModel:UITableViewDataSource {


func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return items[section].sectionTitle
}

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 .nameAndPicture:
if let cell = tableView.dequeueReusableCell(withIdentifier: NameAndPictureCell.identifier, for: indexPath) as? NameAndPictureCell {
cell.item = item
return cell
}
case .about:
if let cell = tableView.dequeueReusableCell(withIdentifier: AboutCell.identifier, for: indexPath) as? AboutCell {
cell.item = item
return cell
}
case .email:
if let cell = tableView.dequeueReusableCell(withIdentifier: EmailCell.identifier, for: indexPath) as? EmailCell {
cell.item = item
return cell
}
case .friend:
if let item = item as? ProfileViewModeFriendsItem, let cell = tableView.dequeueReusableCell(withIdentifier: FriendCell.identifier, for: indexPath) as? FriendCell {
let friend = item.friends[indexPath.row]
cell.item = friend
return cell
}
case .attribute:
if let item = item as? ProfileViewModelAttributeItem, let cell = tableView.dequeueReusableCell(withIdentifier: AttributesCell.identifier, for: indexPath) as? AttributesCell {
cell.item = item.attributes[indexPath.row]
return cell
}
}

// return the default cell if none of above succeed
return UITableViewCell()
}
}


public func dataFromFile(_ filename: String) -> Data? {
@objc class TestClass: NSObject { }

let bundle = Bundle(for: TestClass.self)
if let path = bundle.path(forResource: filename, ofType: "json") {
return (try? Data(contentsOf: URL(fileURLWithPath: path)))
}
return nil
}

class Profile {
var fullName: String?
var pictureUrl: String?
var email: String?
var about: String?
var friends = [Friend]()
var profileAttributes = [Attribute]()

init?(data: Data) {
do {
if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any],
let body = json["data"] as? [String: Any] {
self.fullName = body["fullName"] as? String
self.pictureUrl = body["pictureUrl"] as? String
self.about = body["about"] as? String
self.email = body["email"] as? String

if let friends = body["friends"] as? [[String: Any]] {
self.friends = friends.map { Friend(json: $0) }
}

if let profileAttributes = body["profileAttributes"] as? [[String: Any]] {
self.profileAttributes = profileAttributes.map { Attribute(json: $0) }
}
}
} catch {
print("Error deserializing JSON: \(error)")
return nil
}
}
}

class Friend {
var name: String?
var pictureUrl: String?

init(json: [String: Any]) {
self.name = json["name"] as? String
self.pictureUrl = json["pictureUrl"] as? String
}
}

class Attribute {
var key: String?
var value: String?
init(json: [String: Any]) {
self.key = json["key"] as? String
self.value = json["value"] as? String
}
}

表格 View 不仅应该有 friend 的名字,还应该有 Assets 中的图像。

我还为所有不同类型的单元格定义了自定义类,并将它们出列并注册

已经看了一个星期了,但仍然没有,任何帮助将不胜感激

我还提供了框架并将所有标签、图像等作为 subview 添加到 TableView 中,但没有成功

最佳答案

我有点难以理解。首先,“我还提供了框架并将所有标签、图像等作为 subview 添加到 TableView 中”听起来是错误的。您永远不需要在 UITableView 上调用 addSubview(...)。您可以通过 tableCell.contentView.addSubview(...) 将 UI 元素添加到 UITableViewCell,但即便如此,您最好使用自动布局在界面生成器中设计表格 View 单元格。现在设置框架几乎没用了,因为自动布局已经永远存在了。设置实际帧的唯一位置是在 layoutSubviews()

其次,它不显示是不是因为您将 rowHeight 设为常量而不是 UITableView.automaticDimension?也许您将单元格设计为特定高度,但您还没有告诉表格 View 它们有那个高度?我建议使用谷歌搜索“使用自动布局调整表格单元格大小”或使用表格 View 委托(delegate)方法 ...heightForRowAt indexPath: ...

最后,查看您的代码,我建议您对 JSON 解析方法进行现代化改造:

类似于 this ,或者只是谷歌“JSON and Codable swift”

关于ios - 无法使用 json 数据填充 UITableview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55222116/

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