Swift JSON - 为文本和图像重用TableView单元格

时间:2017-03-24 02:28:23

标签: swift swift3

我想做这样的事情,我希望我的每个JSON数据(来自PHP)显示在表的每个单元格中。 JSON数据包括文本和图像。现在我只能显示文字,但无法提取图像。例如,我想在Section:New Meter Details中显示图像,而我仍然可以在其他单元格中显示文本。 是否可以为文本和图像重复使用表格视图?请提供建议。这是我的JSON数据,我已将其更改为swift词典:

["cp_replacemeter": 1, "cp_current_l3": 3, "cp_voltage_l2": 2221, "cp_tktno": 3333, "ap_contact_no": 998, "cpremark": , "cp_voltage_l3": 2221, "cprefno": 17-0762, "cp_oldmeter_img": images/17-0762/222.jpg, "cpfaultyremark": , "co_id": 15, "cp_customer_signature": images/17-0762/17-0762-CustomerSign.jpg, "cp_meter_cover": Cover Broken, "error": 0, "cp_new_tariff": 1, "cp_service_type": CHANGE METER;, "cprtm_name": CONLOG, "cpi_no": 15670, "cp_meter_seal": Seals Broken, "cpcontact_no": 3331, "cpserviceremark": , "tag": search, "cptm_name": PRESSEY, "cplatitude": 3.12312, "cp_AddPhoto3": images/17-0762/other/17-0762-photo3.jpg, "cpt_of_meter": 3 Phase, "cplongitude": 110.86275, "cp_voltage_l1": 2221, "cp_AddPhoto2": images/17-0762/other/17-0762-photo2.jpg, "cp_AddPhoto5": images/17-0762/other/17-0762-photo5.jpg, "cpDistrict": KB, "cpc_name": 221, "cp_newmeter_img": images/17-0762/1.jpg, "cpaddress": 331, "cp_AddPhoto4": images/17-0762/other/17-0762-photo4.jpg, "cp_fault_type": METER HANG;, "cpr_tometer": 1 PHASE, "cp_old_tariff": 1, "cp_AddPhoto6": images/17-0762/other/17-0762-photo6.jpg, "cpic_no": 3331, "cp_current_l1": 1, "cp_AddPhoto1": images/17-0762/other/17-0762-photo1.jpg, "cpm_no": 222, "cp_current_l2": 2]

import UIKit

class MyTableViewController: UITableViewController {

struct Objects {
    var sectionName : String!
    var sectionObject : [String]!
}

var objectsArray = [Objects]()

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.rowHeight=UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 100
    LoadJsonData()
}

func LoadJsonData () {


    let request = NSMutableURLRequest(url: NSURL(string:"http://<myphpaddress>appcpapi.php")! as URL)
    request.httpMethod = "POST"

    let poststring = "tag=search&refno=17-0762"

    request.httpBody = poststring.data(using: String.Encoding.utf8)

    let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in

        if error != nil
        {
            print("error= \(error)")
            return
        }
        else
        {
            do{
                let dictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : Any]

                let ticket = dictionary["cp_tktno"] ?? "No data" 
                let name = dictionary["cpc_name"] ?? "No data"
                let customerIC = dictionary["cpic_no"] ?? "No data"
                let district = dictionary["cpDistrict"] ?? "No data"
                let customercontact = dictionary["cpcontact_no"] ?? "No data"
                let address = dictionary["cpaddress"] ?? "No data"
                let latitudeGPS = dictionary["cplatitude"] ?? "No data"
                let longitudeGPS = dictionary["cplongitude"] ?? "No data"
                let om = dictionary["cpm_no"] ?? "No data"
                let omtariff = dictionary["cp_old_tariff"] ?? "No data"
                let ombrand = dictionary["cptm_name"] ?? "No data"
                let omtype = dictionary["cpt_of_meter"] ?? "No data"
                let omfaulty = dictionary["cp_fault_type"] ?? "No data"
                let omseal = dictionary["cp_meter_seal"] ?? "No data"
                let omcover = dictionary["cp_meter_cover"] ?? "No data"
                let nm = dictionary["cp_replacemeter"] ?? "No data"
                let nmtariff = dictionary["cp_new_tariff"] ?? "No data"
                let nmbrand = dictionary["cprtm_name"] ?? "No data"
                let nmtype = dictionary["cpr_tometer"] ?? "No data"
                let nmservice = dictionary["cp_service_type"] ?? "No data"
                let v1 = dictionary["cp_voltage_l1"] ?? "No data"
                let v2 = dictionary["cp_voltage_l2"] ?? "No data"
                let v3 = dictionary["cp_voltage_l2"] ?? "No data"
                let a1 = dictionary["cp_current_l1"] ?? "No data"
                let a2 = dictionary["cp_current_l2"] ?? "No data"
                let a3 = dictionary["cp_current_l3"] ?? "No data"
                let contractorID = dictionary["co_id"] ?? "No data"
                let contractorcontact = dictionary["ap_contact_no"] ?? "No data"
                let faultyremark = dictionary["cpfaultyremark"] ?? "No data"
                let serviceremark = dictionary["cpserviceremark"] ?? "No data"

                let newmeterimageurl = NSURL(string:"\(dictionary["cp_newmeter_img"]!)")!
                let newmeterimagedata = NSData(contentsOf: newmeterimageurl as URL)
                let MyWantedToShowImage = UIImage(data: newmeterimagedata! as Data)

                DispatchQueue.main.async {
                    self.objectsArray = [MyTableViewController.Objects(sectionName: "Customer Details",
                                                                       sectionObject:[
                                                                        "Ticket No \n\(ticket)",
                                                                        "Name \n\(name)",
                                                                        "Customer Contact \n\(customercontact)",
                                                                        "Customer IC \n\(customerIC)",
                                                                        "Address \n\(address)",
                                                                        "District:\n\(district)",
                                                                        "Latitude GPS\n\(latitudeGPS)",
                                                                        "Longitude GPS \n\(longitudeGPS)"]),
                                         MyTableViewController.Objects(sectionName: "Old Meter Details",
                                                                       sectionObject:[
                                                                        "Old Meter Number \n\(om)",
                                                                        "Old Meter Tariff \n\(omtariff)",
                                                                        "Old Meter Brand \n \(ombrand)",
                                                                        "Old Meter Type \n\(omtype)",
                                                                        "Old Meter Faulty \n\(omfaulty)",
                                                                        "Old Meter Seal \n\(omseal)",
                                                                        "Old Meter Cover \n\(omcover)"]),
                                         MyTableViewController.Objects(sectionName: "New Meter Details",
                                                                       sectionObject:[
                                                                        "New Meter Number \n\(nm)",
                                                                        "New Meter Tariff \n\(nmtariff)",
                                                                        "New Meter Brand  \n\(nmbrand)",
                                                                        "New Meter Type \n\(nmtype)",
                                                                        "New Meter Service \n\(nmservice)",
                                                                        "L1 Voltage \n\(v1)",
                                                                        "L2 Voltage \n\(v2)",
                                                                        "L3 Voltage \n\(v3)",
                                                                        "L1 Ampere \n\(a1)",
                                                                        "L2 Ampere \n\(a2)",
                                                                        "L3 Ampere \n\(a3)",
                                                                        "New Meter Image \n\(MyWantedToShowImages?.images)"]),
                                         MyTableViewController.Objects(sectionName: "Customer Signature",
                                                                       sectionObject:[
                                                                        "Contrator ID \n\(contractorID)",
                                                                        "Contractor Contact \n\(contractorcontact)",
                                                                        "Faulty Remark \n\(faultyremark)",
                                                                        "Service Remark \n\(serviceremark)"])]

                    self.tableView.reloadData()
                }

            }//Catch Error

            catch let error{
                print(error)
            }
        }

    }
    task.resume()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}



override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return objectsArray[section].sectionObject.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as UITableViewCell!

    cell?.textLabel?.numberOfLines = 0
    cell?.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
    cell?.textLabel?.text = objectsArray[indexPath.section].sectionObject[indexPath.row]
    cell?.textLabel?.font = UIFont.systemFont(ofSize: 13, weight: 0.2)
       return cell!
}

override func numberOfSections(in tableView: UITableView) -> Int{
    return objectsArray.count
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?{

    return objectsArray[section].sectionName
}


}

1 个答案:

答案 0 :(得分:0)

如果要与图像分开显示文本,则必须在故事板中为图像设置另一个单元格原型。为其分配不同的单元格标识符,当您需要图像单元格时,使用新的单元格标识符创建它,类似于您在此处执行的操作:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as UITableViewCell!

如果您希望文本和图像都在一个表格单元格中,那么您只需修改现有原型以适应两者。如果您需要其他信息,请告诉我。