在Swift 2中重新加载数据时,如何保持表格的格式不变?

时间:2016-02-12 15:24:07

标签: ios swift uitableview swift2 realm

这是我的UITableView最初看起来的样子。它看起来很棒,你可以看到。:

enter image description here

当重新加载数据时,它看起来像这样(不太好):

enter image description here

My Realm.io对象如下所示:

import RealmSwift
import Foundation

class Set: Object {

    dynamic var id = NSUUID().UUIDString
    dynamic var set_id = ""
    dynamic var descr = ""
    dynamic var img_sm = ""
    dynamic var img_tn = ""
    dynamic var pieces = ""
    dynamic var qty = ""
    dynamic var theme = ""
    dynamic var year = ""

    // Specify properties to ignore (Realm won't persist these)

    //  override static func ignoredProperties() -> [String] {
    //    return []
    //  }

    override static func primaryKey() -> String? {
        return "id"
    }
}

我为用户提供了一个选项,可以通过警报更改表的排序,他们可以选择几个选项:

func showSorting(errorTitle:String, errorMessage:String) {
    let alert = UIAlertController(title: "\(errorTitle)", message: "\(errorMessage)", preferredStyle: .Alert) // 1
    let firstAction = UIAlertAction(title: "Sort by Set Number", style: .Default) { (alert: UIAlertAction!) -> Void in
        NSLog("Sorting by Number")

        self.array = try! Realm().objects(Set).sorted("set_id", ascending: true)
        self.tableView.reloadData()

    } // 2
    alert.addAction(firstAction) // 4

    let secondAction = UIAlertAction(title: "Sort by Set Name", style: .Default) { (alert: UIAlertAction!) -> Void in
        NSLog("Sorting by Name")
        self.array = try! Realm().objects(Set).sorted("descr", ascending: true)
        self.tableView.reloadData()
    } // 3

    alert.addAction(secondAction) // 5

    presentViewController(alert, animated: true, completion:nil) // 6
}

非常简单的东西。拉取Realm对象并对所需方法进行排序,然后重新加载表。重新加载正在弄乱的数据。

我在表视图单元格中使用字幕样式。

这里是单元格的呈现方式:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

    let imageView = cell.viewWithTag(30) as! UIImageView

    let Title = cell.viewWithTag(10) as! UILabel

    let subTitle = cell.viewWithTag(20) as! UILabel

    Title.textColor = UIColor.whiteColor()
    subTitle.textColor = UIColor.whiteColor()
    cell.backgroundColor = UIColor(red: 0.7176, green: 0.1647, blue: 0.2, alpha: 1.0) /* #b72a33 */

    let object = array[indexPath.row]

    let img_url = object.img_sm
    cell.textLabel?.text = object.set_id

    imageView.contentMode = .ScaleAspectFit

    if let checkedUrl = NSURL(string: "\(img_url)") {
        imageView.contentMode = .ScaleAspectFit

        getDataFromUrl(checkedUrl) { (data, response, error)  in
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                guard let data = data where error == nil else { return }
                imageView.image = UIImage(data: data)
            }
        }
    }

    subTitle.text = object.descr

    return cell
}

我希望这会有所帮助。我不确定我做错了什么,搞砸了?谢谢你的帮助,我非常感谢! :)

4 个答案:

答案 0 :(得分:3)

  1. 请记住,重新加载单元格后,重复使用。必须重新重置小区的每个方面;否则它可能会从之前的使用中遗留下来。

  2. 看起来你正试图在cellForRowAtIndexPath内部进行某种联网。你不能这样做。您必须立即返回 单元格。如果您的数据需要联网,请返回占位符并单独进行网络连接(并在需要进行任何网络连接时重新加载单元格)。

  3. 因此,例如,这段代码是错误的:

    if let checkedUrl = NSURL(string: "\(img_url)") {
        imageView.contentMode = .ScaleAspectFit
    
        getDataFromUrl(checkedUrl) { (data, response, error)  in
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                guard let data = data where error == nil else { return }
                imageView.image = UIImage(data: data)
            }
        }
    }
    

    在网络延迟后,您不能直接更改单元格的任何方面。如你所知,到那时,细胞甚至可能都不存在。要从网络中获取数据,请将其提取到模型中,然后重新加载表。

答案 1 :(得分:1)

创建自定义UITableViewCell类。这将确保渲染正确。请参阅下面的自定义uitableview单元类图片。

enter image description here

希望这有效!

答案 2 :(得分:0)

这是因为图像具有固有的大小。只需给'imageView'一个静态的宽度和高度。由于您没有更改单元格的大小,这将使所有单元格看起来都一样。

答案 3 :(得分:-2)

您可以创建自定义表格单元格,并且必须从索引

的行的单元格中删除以下代码
if let checkedUrl = NSURL(string: "\(img_url)") {
    imageView.contentMode = .ScaleAspectFit

    getDataFromUrl(checkedUrl) { (data, response, error)  in
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            guard let data = data where error == nil else { return }
            imageView.image = UIImage(data: data)
        }
    }
}