UITableView

时间:2015-10-02 07:55:28

标签: ios swift uitableview custom-cell

我正在尝试使用两个自定义单元格来显示产品信息,第一个显示产品主要信息,第二个显示产品主要信息。

目前所有内容都链接在StoryBoard中,并且我的tableview准备将注释信息存储在第二个自定义单元格中(我已经检查了requestComments()函数并且它工作正常但我无法使它们出现。

是否与 numberOfRowsInSection 相关?因为我尝试使用comments.count对products.count进行SUM并且显示错误。

这是我第一次使用两个自定义单元格,所以我希望有人可以帮助我。

这是我的代码:

import UIKit
import Social

class MarcaProductoViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet var productoImageView:UIImageView!
@IBOutlet var tableView:UITableView!

@IBOutlet var votarFrame:UIView!
@IBOutlet var votarBarra:UISlider!
@IBOutlet var votarLabel:UILabel!

var productoImage:String!

var nombre:String!

var producto:Producto!
var productos = [Producto]()

var mensaje:Mensaje!
var mensajes = [Mensaje]()

var img:UIImage?

override func viewDidLoad() {

    super.viewDidLoad()

    // Set table view background color
    self.tableView.backgroundColor = UIColor(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 0.2)

    // Remove extra separator
    self.tableView.tableFooterView = UIView(frame: CGRectZero)

    // Change separator color
    self.tableView.separatorColor = UIColor(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 0.8)

    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.estimatedRowHeight = 88.0

    requestPost()

    requestComments()

    tableView.reloadData()
}

override func viewDidAppear(animated: Bool) {
    tableView.reloadData()
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    self.navigationController?.hidesBarsOnSwipe = false
    self.navigationController?.setNavigationBarHidden(false, animated: true)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func requestPost () {

    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.website.es/product.php")!)
    request.HTTPMethod = "POST"
    let postString = "name="+name
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            print("error=\(error)")
            return
        }

        self.productos = self.parseJsonData(data!)

        // Reload table view
        dispatch_async(dispatch_get_main_queue(), {
            self.tableView.reloadData()
        })
    }
    task.resume()

    tableView.reloadData()
}

func parseJsonData(data: NSData) -> [Producto] {

    var productos = [Producto]()

    do {
        let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary

        // Parse JSON data
        let jsonProductos = jsonResult?["lista_productos"] as! [AnyObject]
        for jsonProducto in jsonProductos {

            let producto = Producto()
            producto.image = jsonProducto["image"] as! String
            producto.name = jsonProducto["name"] as! String
            producto.desc = jsonProducto["desc"] as! String

            productos.append(producto)
        }
    }
    catch let parseError {
        print(parseError)
    }

    return productos
}

func requestComments () {

    //print("Hola")

    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.website.es/comments.php")!)
    request.HTTPMethod = "POST"
    let postString = "name="+name

    //print(postString)

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {
            print("error=\(error)")
            return
        }

        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
        print("mensajes = \(responseString)")

        self.mensajes = self.parseJsonDataComments(data!)

        // Reload table view
        dispatch_async(dispatch_get_main_queue(), {
            self.tableView.reloadData()
        })
    }
    task.resume()

    tableView.reloadData()
}

func parseJsonDataComments(data: NSData) -> [Mensaje] {

    var messages = [Mensaje]()

    do {
        let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary

        // Parse JSON data
        let jsonProductos = jsonResult?["messages"] as! [AnyObject]
        for jsonProducto in jsonProductos {

            let message = Mensaje()
            message.author = jsonProducto["author"] as! String
            message.message = jsonProducto["message"] as! String
            message.date = jsonProducto["date"] as! String

            messages.append(message)
        }
    }
    catch let parseError {
        print(parseError)
    }

    return message
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // Return the number of sections.
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    // Return the number of rows in the section.
    return productos.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    title = productos[indexPath.row].nombre

    if indexPath.row == 0 {

        print("11")

        let cell = tableView.dequeueReusableCellWithIdentifier("CellDetail", forIndexPath: indexPath) as! ProductoTableViewCell

        cell.selectionStyle = .None

        if let url = NSURL(string: productos[indexPath.row].imagen) {
            if let data = NSData(contentsOfURL: url) {
                self.productoImageView.image = UIImage(data: data)
            }
        }

        cell.name.text = productos[indexPath.row].name

        cell.desc.text = productos[indexPath.row].desc

        cell.layoutIfNeeded()

        return cell
    }
    else {

        print("22")

        let cell2 = tableView.dequeueReusableCellWithIdentifier("MostrarComentarios", forIndexPath: indexPath) as! ComentariosTableViewCell

        cell2.selectionStyle = .None

        cell2.author.text = mensajes[indexPath.row].author

        cell2.comment.text = mensajes[indexPath.row].comments

        cell2.date.text = mensajes[indexPath.row].date

        cell2.layoutIfNeeded()

        return cell2
    }
} }

更新

我做了以下更改:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // Return the number of sections.
    return productos.count+mensajes.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    // Return the number of rows in the section.
    return productos.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    title = productos[indexPath.row].nombre

    if indexPath.section == 0 {

        print("11")

        let cell = tableView.dequeueReusableCellWithIdentifier("CellDetail", forIndexPath: indexPath) as! ProductoTableViewCell

        cell.selectionStyle = .None

        if let url = NSURL(string: productos[indexPath.row].imagen) {
            if let data = NSData(contentsOfURL: url) {
                self.productoImageView.image = UIImage(data: data)
            }
        }

        cell.nombre.text = productos[indexPath.row].nombre

        cell.descripcion.text = productos[indexPath.row].descripcion

        cell.modo_de_empleo.text = productos[indexPath.row].modo_de_empleo

        cell.marca.text = productos[indexPath.row].marca

        cell.linea.text = productos[indexPath.row].linea

        cell.distribuidor.text = productos[indexPath.row].distribuidor

        cell.tamano.text = productos[indexPath.row].tamano

        cell.precio.text = productos[indexPath.row].precio

        cell.codigo_nacional.text = productos[indexPath.row].codigo_nacional

        cell.layoutIfNeeded()

        return cell
    }
    else {

        let cell2 = tableView.dequeueReusableCellWithIdentifier("MostrarComentarios", forIndexPath: indexPath) as! ComentariosTableViewCell

        print(mensajes[indexPath.row].mensaje)

        cell2.selectionStyle = .None

        cell2.comentario.text = mensajes[indexPath.row].mensaje

        cell2.fecha.text = mensajes[indexPath.row].fecha

        cell2.layoutIfNeeded()

        return cell2
    }
}

目前,我可以完美地显示评论,但问题是这个产品的消息总是一样的(在每个新的评论行中重复)我只需要改变一些东西(我不知道到底是什么) )显示消息的正确信息而不会重复。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为你必须使用return products.count

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return products.count
}

您必须使用% 2 == 0代替== 0

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  title = productos[indexPath.row].nombre

  if indexPath.row % 2 == 0 { // runs if indexPath.row = 0, 2, 4, 6 etc
    let cell = tableView.dequeueReusableCellWithIdentifier("CellDetail", forIndexPath: indexPath) as! ProductoTableViewCell

    return cell
  } else { // runs if indexPath.row = 1, 3, 5, 7 etc
    let cell2 = tableView.dequeueReusableCellWithIdentifier("MostrarComentarios", forIndexPath: indexPath) as! ComentariosTableViewCell

    return cell2
  }
}

剩余运营商

  

余数运算符(a%b)计算出b的多少倍   适合在a内部并返回剩余的值(称为   余数)。

     

以下是余数运算符的工作原理。首先计算9%4   弄清楚9中有多少4个适合:

enter image description here

  

你可以在9中装入两个4,其余的是1(以橙色显示)。

     

在Swift中,这将被写为:

9 % 4    // equals 1

答案 1 :(得分:0)

如果有人遇到同样的问题:

else {

        let cell2 = tableView.dequeueReusableCellWithIdentifier("MostrarComentarios", forIndexPath: indexPath) as! ComentariosTableViewCell

        cell2.selectionStyle = .None

        cell2.comentario.text = mensajes[(indexPath.section)-1].mensaje

        cell2.fecha.text = mensajes[(indexPath.section)-1].fecha

        cell2.layoutIfNeeded()

        return cell2
    }

此致