在Android中有一个循环视图,您可以使用资源管理来加载数据,这一切都取决于限制。
例如,我想在IOS中做的是拥有一个表视图单元格,并将其限制为每个滚动只有5个项目。我这样做的原因是不能一次加载所有数据。我想每5次加载数据。
Android到IOS的资源管理等同于什么?
答案 0 :(得分:2)
像UITableView,UICollectionView和ViewControllers这样的视图(如UIPageViewController和UITabBarController)已针对性能和资源使用进行了优化。通常,他们只会加载创建屏幕内容所需的内容。
每个班级都以不同的方式进行优化。 UITabBarController初始化每个嵌入的ViewController,但在您选择ViewController的选项卡之前,不会加载它们的视图。一旦开始滚动,UIPageViewController就会预加载并缓存下一个或上一个viewController。
UITableView将重用其单元格。 tableView将创建一组初始单元格来填充屏幕。在重复使用单元格之后,如果所有单元格都具有相同的reuseIdentifier并且它们的高度相同,则保留在内存中的最大单元格数是填充屏幕所需的数量+ 1.在单元格重用期间,将单元格放入一旦它移出屏幕就会缓存。当需要下一个单元时,它将从该缓存中获取。
如果您执行一些操作(例如为同一个单元格设置相同的reuseIdentifier),则会自动执行此操作
您必须记住,每个单元格都会多次显示,因此您必须相应地调整代码。例如,您通常不想在tableView:cellForRowAtIndexPath:
中向单元格添加视图,因为它可以并且将被多次调用。您应该设计视图以获得最大的可重用性,并创建UITableViewCell子类,您可以在单元格的init
中添加这些视图。
探索这一切的最佳方法是创建一堆带有日志记录代码的测试项目。例如,要在UITableView中看到重用:
class Cell: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: UITableViewCellStyle.Default, reuseIdentifier: reuseIdentifier)
println("init Cell")
}
required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
deinit {
println("deinit Cell")
}
override func prepareForReuse() {
if let text = textLabel!.text {
println("prepareForReuse of cell with text \"\(text)\"")
}
super.prepareForReuse()
}
}
class ViewController: UITableViewController {
override func viewDidLoad() {
tableView.registerClass(Cell.self, forCellReuseIdentifier: "TestCell")
tableView.rowHeight = 130 // we don't need 15 cells on screen to demonstrate how that works
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("TestCell", forIndexPath: indexPath) as! Cell
cell.textLabel!.text = "Cell \(indexPath.row)"
println("Display Cell \(indexPath.row)")
return cell
}
}
加载后导致此控制台输出:
init Cell
Display Cell 0
init Cell
Display Cell 1
init Cell
Display Cell 2
init Cell
Display Cell 3
init Cell
Display Cell 4
init Cell
Display Cell 5
滚动单元格重复使用后(第一个init是必需的+1单元格,因为索引= 6单元格在index = 0单元格离开屏幕之前可见):
init Cell
Display Cell 6
prepareForReuse of cell with text "Cell 0"
Display Cell 7
prepareForReuse of cell with text "Cell 1"
Display Cell 8