【问题标题】:How to load array of data in table view when tap on Next button in iOS Swift?在iOS Swift中点击下一步按钮时如何在表格视图中加载数据数组?
【发布时间】:2023-03-31 20:42:01
【问题描述】:

我尝试在 tableview 中加载数组项详细信息。在 tableview 中,我列出了标签数组。并在导航栏上放置了两个按钮,分别是Nextprevious

当用户点击 next 时,它将替换 tableview 中的数组标签值,或者如果用户点击 previous,它将替换 tableview 中的数组标签值。

为了从 json 获取数据,我使用的是 SwiftyJson。这是我的 json 响应值:

    "results": [
  {

   "PoDocNo": "4500022400",
   "Item": "00010",
   "Material": "RMECC_MOB1",
   "StorageLocation": "3001",
   "MatGroup": "00107",
    "Quantity": "2.000",
   "OrderUnit": "KG",
   "NetPrice": "1000.000",
   "UnitofPrice": "1.000",
   "ItemCat": "0",
   "Requistor": ""
   },
   {

   "PoDocNo": "4500022400",
   "Item": "00020",
    "Material": "RMECC_MOB1",
    "StorageLocation": "3001",
   "MatGroup": "00107",
   "Quantity": "2.000",
   "OrderUnit": "KG",
   "NetPrice": "1000.000",
   "UnitofPrice": "1.000",
   "ItemCat": "0",
   "Requistor": ""
   }
  ] 

这是我的屏幕截图:

这是我的模型:

    import Foundation
    import SwiftyJSON

   class PoVendorModel {

   var Material: String?
    var Description: String?
   var FixedVendor: String?
var VendorName: String?
var PurchOrg: String?
var PurchGroup : String?
var valuationPrice : String?
var Qty: String?
var UoM:String?

var totalValue: String?
var DeliveryDate: String?
var MatGrp: String?
var Plant: String?
var StorageLocation: String?
var ReqTrack: String?
var AAC: String?
var ItemCategory: String?
var GLAccount: String?
var CostCenter: String?
var Order: String?
var WBS: String?
var ProfitCenter: String?
var lineNo: String?

init(json: JSON) {

    Material = json["Material"].stringValue
    Qty = json["Quantity"].stringValue
    UoM = json["OrderUnit"].stringValue
    totalValue = json["NetPrice"].stringValue
    AAC = json["shrtText"].stringValue
    StorageLocation = json["StorageLocation"].stringValue
    MatGrp = json["MatGroup"].stringValue
    valuationPrice = json["NetPrice"].stringValue
    ItemCategory = json["ItemCat"].stringValue

    lineNo = json["Item"].stringValue

}

func getProperty(at index: Int) -> String {

    switch index {
    case 0:
        return self.Material ?? ""
    case 1:
        return self.Description ?? ""
    case 2:
        return self.FixedVendor ?? ""
    case 3:
        return self.VendorName ?? ""
    case 4:
        return self.PurchOrg ?? ""
    case 5:
        return self.PurchGroup ?? ""
    case 6:
        return self.Qty ?? ""
    case 7:
        return self.valuationPrice ?? ""
    case 8:
        return self.totalValue ?? ""
    case 9:
        return self.DeliveryDate ?? ""
    case 10:
        return self.MatGrp ?? ""
    case 11:
        return self.Plant ?? ""
    case 12:
        return self.StorageLocation ?? ""
    case 13:
        return self.ReqTrack ?? ""
    case 14:
        return self.AAC ?? ""
    case 15:
        return self.ItemCategory ?? ""
    case 16:
        return self.GLAccount ?? ""
    case 17:
        return self.CostCenter ?? ""
    case 18:
        return self.Order ?? ""
    case 19:
        return self.WBS ?? ""
    case 20:
        return self.ProfitCenter ?? ""
    case 21:
        return self.UoM ?? ""

    default:
        return "Error"
    }

  }

 }

当我点击表格视图标签值中的下一个按钮时,如何替换值数组?

【问题讨论】:

  • 考虑使用Codable——它将帮助您摆脱所有这些可选属性,并且不再需要提供默认值(例如return self.PurchGroup ?? "")。
  • 1.更新数据源中的值,2. 在您的 UITableView 上调用 reloadData()

标签: ios arrays json swift uitableview


【解决方案1】:

无论处理您的“下一个”和“上一个”点击的对象都应该知道您的所有数据和当前的“页码”。给你的 tableView 一个PoVendorModel 类型的属性(如果它还没有)。点击 Next 或 Previous 可以更新页码,索引到模型数组并将相关的分配给 tableView。 tableView 可以对此做出反应并在值更改时自行更新。

无论处理下一次/上一次点击:

var allVendors: [PoVendorModel]

var pageNumber: Int = 0 {
    didSet {
        tableViewController.vendorData = allVendors[pageNumber]
    }
}

func nextTapped() {
    pageNumber = min(allVendors.count - 1, pageNumber + 1)
}

func previousTapped() {
    pageNumber = max(0, pageNumber - 1)
}

在你的 UITableViewController 中:

// A property of your UITableViewController
var vendorData: PoVendorModel? = nil {
    didSet {
        tableView?.reloadData()
    }
}

【讨论】:

    【解决方案2】:

    首先,不要手动解析所有JSON响应,而是使用Codable

    您应该创建的模型

    struct Root: Decodable {
        let vendors: [PoVendorModel]
    
        enum CodingKeys: String, CodingKey {
            case vendors = "results"
        }
    }
    
    struct PoVendorModel: Decodable {
        let poDocNo, item, material, storageLocation, matGroup, quantity, orderUnit, netPrice, unitofPrice, itemCat, requistor: String
    
        enum CodingKeys: String, CodingKey {
            case poDocNo = "PoDocNo"
            case item = "Item"
            case material = "Material"
            case storageLocation = "StorageLocation"
            case matGroup = "MatGroup"
            case quantity = "Quantity"
            case orderUnit = "OrderUnit"
            case netPrice = "NetPrice"
            case unitofPrice = "UnitofPrice"
            case itemCat = "ItemCat"
            case requistor = "Requistor"
        }
    }
    

    解析 JSON 数据 使用上面创建的模型,

    if let data = data {
        do {
            let root = try JSONDecoder().decode(Root.self, from: data)
            self.vendors = root.vendors //created in viewController
        } catch {
            print(error)
        }
    }
    

    ViewController 中,为vendors 和您将用于tableView's dataSourcedataSource 实例创建属性。此外,维护一个currentIndex,它将跟踪tableView 中可见的当前vendor

    class VC: UIViewController {
        @IBOutlet weak var tableView: UITableView!
    
        var currentIndex: Int = 0
    
        var vendors = [PoVendorModel]() {
            didSet {
                self.dataSource = vendors.first
            }
        }
    
        var dataSource: PoVendorModel? {
            didSet {
                self.tableView.reloadData()
            }
        }
    }
    

    nextprevious 按钮的 button 操作类似于,

    @IBAction func onTapNextButton(_ sender: UIButton) {
        let nextIndex = min(currentIndex+1, vendors.count)
        if nextIndex != currentIndex {
            self.dataSource = vendors[nextIndex]
            currentIndex = nextIndex
        }
    }
    
    @IBAction func onTapPreviousButton(_ sender: UIButton) {
        let previousIndex = max(0, currentIndex-1)
        if previousIndex != currentIndex {
            self.dataSource = vendors[previousIndex]
            currentIndex = previousIndex
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多