我正在开展一个需要我从未想象过的项目。由于尺寸,iOS的应用程序是针对iPad的。对于这个问题,我制作了一个小型原型,以便更好地展示其中一方。
这是一个tableView,其中将发生功能和操作。
这是Swift代码:
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let data:[String] = ["Row 0","Row 1", "Row 2","Row 3","Row 4","Row 5","Row 6"]
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:Cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! Cell
cell.labelText.text = self.data[indexPath.row]
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = self.tableView.cellForRowAtIndexPath(indexPath)
cell!.alpha = 0.5
}
}
该应用应该做什么?
好吧,当选择一行时,它下面的行需要保持Alpha等于0.5。
示例:
我触及第3行
动作:
第1行,第2行和第3行将 Alpha 保持等于 1.0
第4行,第5行和第6行将 Alpha 保持等于 0.5
我触及第4行
动作:
第1行,第2行,第3行和第4行将 Alpha 保持等于 1.0
第5行第6行将 Alpha 保持等于 0.5
有人可以帮助我吗?
答案 0 :(得分:4)
你想在cellForRowAtIndexPath中设置alpha值,然后在点击时重新加载该行。这应该保留该单元格的alpha并在每个其他单元格上将alpha设置为1,即使用户将单元格滚动到屏幕外。
var selectedIndexPath:NSIndexPath?
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
if let selectedIndexPath = self.selectedIndexPath where indexPath.row == selectedIndexPath.row {
cell.alpha = 0.5
} else {
cell.alpha = 1
}
cell.labelText.text = self.data[indexPath.row]
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.selectedIndexPath = indexPath
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}
答案 1 :(得分:3)
创建一个整数变量“selectedCell"
,在didSelectRowAtIndexPath
中,将其设置为indexPath.row
,然后tableView.reloadData()
在cellForRowAtIndexPath
中,只需使用if语句来确定indexPath.row
是否大于“selectedCell
”。如果是,则将alpha值设置为0.5
,否则将其设置为1.0
。
在cellForRowAtIndexPath
中更改单元格属性通常是一种很好的做法,因为每次调用它时都有可能覆盖对代码中其他位置的单元格所做的更改。希望这有帮助。
答案 2 :(得分:1)
您好我提出以下解决方案,请考虑
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let data:[String] = ["Row 0","Row 1", "Row 2","Row 3","Row 4","Row 5","Row 6"]
var rowSelected:Int
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:Cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! Cell
cell.labelText.text = self.data[indexPath.row]
if rowSelected <= indexPath.row
cell!.alpha = 0.5;
else
cell!.alpha = 1.0;
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = self.tableView.cellForRowAtIndexPath(indexPath)
rowSelected = indexPath.row
tableView.reloadData()
}
}
答案 3 :(得分:1)
我不确定您是在描述您想要它做什么还是正常行为。
有两种可能性:
1)如果你想在一行上渲染与选择相关的alpha,你可能想要覆盖didDeselectRowAtIndexPath并将alpha设置为1.0。
2)您需要在从dequeueReusableCellWithIdentifier获取单元格后显式设置alpha,因为您不能保证每次都获得一个新的单元格实例。
即使首次显示,tableview也会出于各种原因调用cellForRowAtIndexPath。可能发生的是,对于已取消选择的行调用cellForRowAtIndexPath,并且dequeueReusableCellWithIdentifier可能会或可能不会重用现有的单元对象。当它重用单元格对象时,不会重置属性。