Swift: 原型单元格中的步进器,如何刷新标签文本?
Swift: Stepper within a prototype cell, how to refresh the label text?
我想在我的应用中添加一个步进器,以便用户可以将值从 1 增加到 100。
我可以让步进器显示,我已经添加了动作,但是 tableview 中的标签没有刷新...每次用户点击步进器时我都需要执行 "self.tableView.reloadRowsAtIndexPaths" 吗?
class SettingsOptionTableViewCell: UITableViewCell {
@IBOutlet weak var labelvalueforstepper: UILabel!
@IBOutlet weak var simpleStepper: UIStepper!
@IBOutlet weak var labelwithStepper: UILabel!
}
class SettingOptionsTableViewController: UITableViewController {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell = tableView.dequeueReusableCellWithIdentifier("SettingOptionsCell3") as! SettingsOptionTableViewCell
cell.labelwithStepper.text = "Value:"
cell.simpleStepper.value = 1
cell.labelvalueforstepper.text = (cell.simpleStepper.value).description
cell.simpleStepper.wraps = false
cell.simpleStepper.autorepeat = true
cell.simpleStepper.maximumValue = 100
cell.simpleStepper.addTarget(self, action: "stepperValueChanged:", forControlEvents: UIControlEvents.ValueChanged)
}
func stepperValueChanged(sender: UIStepper) {
let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.tableView)
let cellIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)
if let myRowSection = cellIndexPath?.section {
if let myRow = cellIndexPath?.row {
var device_status: Int = Int(sender.value)
println(sender.value)
println(myRow)
segmentDeviceViewValueChange(myRow, userSelection: device_status)
let cell: SettingsOptionTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("SettingOptionsCell3", forIndexPath: cellIndexPath!) as! SettingsOptionTableViewCell
cell.labelvalueforstepper.text = device_status.description
}
}
}
}
与其让 table 视图控制器进入每个单元格并进行大量操作,不如让单元格负责保持步进器和标签同步。
将 属性 添加到单元格 class 中,这是步进器的值。为 属性 使用自定义 setter 来更新步进器和标签,并使用自定义 getter returns 当前步进器值。 UIAction
当步进器被点击时的方法只需要担心将标签设置为正确的值。
如果您需要 table 视图控制器在步进器值更改时立即知道,请使用委托协议或 post 值已更改的通知。
一旦您准备好所有代码,请确保单元中的所有插座都已连接,并且在点击步进器时会向单元发送一个动作。
此外,由于您只将 labelwithStepper
的文本设置为 "Value:"
,因此您可以直接在 IB 中编辑标签,并且可以少连接一个插座。
我想在我的应用中添加一个步进器,以便用户可以将值从 1 增加到 100。
我可以让步进器显示,我已经添加了动作,但是 tableview 中的标签没有刷新...每次用户点击步进器时我都需要执行 "self.tableView.reloadRowsAtIndexPaths" 吗?
class SettingsOptionTableViewCell: UITableViewCell {
@IBOutlet weak var labelvalueforstepper: UILabel!
@IBOutlet weak var simpleStepper: UIStepper!
@IBOutlet weak var labelwithStepper: UILabel!
}
class SettingOptionsTableViewController: UITableViewController {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell = tableView.dequeueReusableCellWithIdentifier("SettingOptionsCell3") as! SettingsOptionTableViewCell
cell.labelwithStepper.text = "Value:"
cell.simpleStepper.value = 1
cell.labelvalueforstepper.text = (cell.simpleStepper.value).description
cell.simpleStepper.wraps = false
cell.simpleStepper.autorepeat = true
cell.simpleStepper.maximumValue = 100
cell.simpleStepper.addTarget(self, action: "stepperValueChanged:", forControlEvents: UIControlEvents.ValueChanged)
}
func stepperValueChanged(sender: UIStepper) {
let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.tableView)
let cellIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)
if let myRowSection = cellIndexPath?.section {
if let myRow = cellIndexPath?.row {
var device_status: Int = Int(sender.value)
println(sender.value)
println(myRow)
segmentDeviceViewValueChange(myRow, userSelection: device_status)
let cell: SettingsOptionTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("SettingOptionsCell3", forIndexPath: cellIndexPath!) as! SettingsOptionTableViewCell
cell.labelvalueforstepper.text = device_status.description
}
}
}
}
与其让 table 视图控制器进入每个单元格并进行大量操作,不如让单元格负责保持步进器和标签同步。
将 属性 添加到单元格 class 中,这是步进器的值。为 属性 使用自定义 setter 来更新步进器和标签,并使用自定义 getter returns 当前步进器值。 UIAction
当步进器被点击时的方法只需要担心将标签设置为正确的值。
如果您需要 table 视图控制器在步进器值更改时立即知道,请使用委托协议或 post 值已更改的通知。
一旦您准备好所有代码,请确保单元中的所有插座都已连接,并且在点击步进器时会向单元发送一个动作。
此外,由于您只将 labelwithStepper
的文本设置为 "Value:"
,因此您可以直接在 IB 中编辑标签,并且可以少连接一个插座。