在 TableView 中按下时更新 UISwitch 的状态
Update the state of a UISwitch when pressed in a TableView
我有一个 iOS 应用程序需要远程打开 on/off 灯。该应用程序从 parse.com 获取灯光数据,并构建一个表格视图,其中每个单独的单元格显示灯光的名称和一个 UISwitch。我想知道如何在打开或关闭其中一盏灯时更改存储在 parse.com 上的布尔值。问题是开关使用的 IBAction 不是布尔值,我不能写,如果更新灯值的语句是按下开关。我已经在我的单元格 class 中创建了 IBaction,并希望它可以被 tableviewcontroller class 使用。
这是我的 tableviewcontroller 的一部分 class
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:RelayCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as RelayCell
let label:PFObject = self.labelArray.objectAtIndex(indexPath.row) as PFObject //create the object label
cell.relayTextField.text = label.objectForKey("text") as String //put the text in the labeltextField
if (label.objectForKey("switch") as NSObject == 1) {
//cell.mySwitch = true //turn the switch on depending on the boolean value in switchColumn
cell.mySwitch.setOn(true, animated: true)
}
else{
//cell.mySwitch = false //turn the switch on depending on the boolean value in switchColumn
cell.mySwitch.setOn(false, animated: true)
}
return cell
}
这段代码显示了每个独立开关的状态,但是,我现在想要的是能够按下应用程序上的每个独立按钮并更改在线数据库中的值。
你能帮我解决一下吗,因为我没有在网上找到任何东西。
class RelayCell: UITableViewCell {
@IBOutlet weak var mySwitch: UISwitch!
@IBOutlet weak var relayTextField: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
relayTextField.layer.borderColor = UIColor.blackColor().CGColor
relayTextField.layer.borderWidth = 0.8
relayTextField.layer.cornerRadius = 10
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func switchChangedState(sender: UISwitch) {
}
}
这是我的 RelayCell class,由 tableViewController class 中的 tableView 方法使用。
UISwitch 有 "on" 属性,用它来获取当前状态的布尔值。
处理此问题的一种方法是向 RelayCell
添加回调 属性 并从 switchChangedState
:
调用回调
class RelayCell: UITableViewCell {
typealias SwitchCallback = (Bool) -> Void
var switchCallback: SwitchCallback?
@IBAction func switchChangedState(sender: UISwitch) {
switchCallback?(sender.on)
}
// ... rest of RelayCell
}
在您的 tableView:cellForRowAtIndexPath:
方法中,设置单元格的回调:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:RelayCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as RelayCell
cell.switchCallback = { [weak self] (switchIsOn) in
self?.setSwitchValue(switchIsOn, forRowAtIndexPath:indexPath)
Void()
}
// ... rest of tableView:cellForRowAtIndexPath:
return cell
}
然后你可以在 setSwitchValue:forRowAtIndexPath:
中做任何你需要的事情,这是你添加到 table 视图控制器的方法 class:
private func setSwitchValue(switchIsOn: Bool, forRowAtIndexPath indexPath: NSIndexPath) {
println("row \(indexPath.row) switch on-ness is now \(switchIsOn)")
}
我有一个 iOS 应用程序需要远程打开 on/off 灯。该应用程序从 parse.com 获取灯光数据,并构建一个表格视图,其中每个单独的单元格显示灯光的名称和一个 UISwitch。我想知道如何在打开或关闭其中一盏灯时更改存储在 parse.com 上的布尔值。问题是开关使用的 IBAction 不是布尔值,我不能写,如果更新灯值的语句是按下开关。我已经在我的单元格 class 中创建了 IBaction,并希望它可以被 tableviewcontroller class 使用。
这是我的 tableviewcontroller 的一部分 class
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:RelayCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as RelayCell
let label:PFObject = self.labelArray.objectAtIndex(indexPath.row) as PFObject //create the object label
cell.relayTextField.text = label.objectForKey("text") as String //put the text in the labeltextField
if (label.objectForKey("switch") as NSObject == 1) {
//cell.mySwitch = true //turn the switch on depending on the boolean value in switchColumn
cell.mySwitch.setOn(true, animated: true)
}
else{
//cell.mySwitch = false //turn the switch on depending on the boolean value in switchColumn
cell.mySwitch.setOn(false, animated: true)
}
return cell
}
这段代码显示了每个独立开关的状态,但是,我现在想要的是能够按下应用程序上的每个独立按钮并更改在线数据库中的值。
你能帮我解决一下吗,因为我没有在网上找到任何东西。
class RelayCell: UITableViewCell {
@IBOutlet weak var mySwitch: UISwitch!
@IBOutlet weak var relayTextField: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
relayTextField.layer.borderColor = UIColor.blackColor().CGColor
relayTextField.layer.borderWidth = 0.8
relayTextField.layer.cornerRadius = 10
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func switchChangedState(sender: UISwitch) {
}
}
这是我的 RelayCell class,由 tableViewController class 中的 tableView 方法使用。
UISwitch 有 "on" 属性,用它来获取当前状态的布尔值。
处理此问题的一种方法是向 RelayCell
添加回调 属性 并从 switchChangedState
:
class RelayCell: UITableViewCell {
typealias SwitchCallback = (Bool) -> Void
var switchCallback: SwitchCallback?
@IBAction func switchChangedState(sender: UISwitch) {
switchCallback?(sender.on)
}
// ... rest of RelayCell
}
在您的 tableView:cellForRowAtIndexPath:
方法中,设置单元格的回调:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:RelayCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as RelayCell
cell.switchCallback = { [weak self] (switchIsOn) in
self?.setSwitchValue(switchIsOn, forRowAtIndexPath:indexPath)
Void()
}
// ... rest of tableView:cellForRowAtIndexPath:
return cell
}
然后你可以在 setSwitchValue:forRowAtIndexPath:
中做任何你需要的事情,这是你添加到 table 视图控制器的方法 class:
private func setSwitchValue(switchIsOn: Bool, forRowAtIndexPath indexPath: NSIndexPath) {
println("row \(indexPath.row) switch on-ness is now \(switchIsOn)")
}