这是我的UITableView最初看起来的样子。它看起来很棒,你可以看到。:
当重新加载数据时,它看起来像这样(不太好):
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
}
我希望这会有所帮助。我不确定我做错了什么,搞砸了?谢谢你的帮助,我非常感谢! :)
答案 0 :(得分:3)
请记住,重新加载单元格后,重复使用。必须重新重置小区的每个方面;否则它可能会从之前的使用中遗留下来。
看起来你正试图在cellForRowAtIndexPath
内部进行某种联网。你不能这样做。您必须立即返回 单元格。如果您的数据需要联网,请返回占位符并单独进行网络连接(并在不需要进行任何网络连接时重新加载单元格)。
因此,例如,这段代码是错误的:
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)
答案 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)
}
}
}