我有一个UISwitch
,它包含在Prototype单元格中,该单元格是UITableViewCell
的子类。此原型单元格包含UISwitch
,其初始状态我希望在应用程序最初启动时设置为false,并且每当用户更改时我希望存储其状态。当UISwitch
包含在原型单元格内时,我的问题是尝试从UITableViewController
中获取对UISwitch
的引用。
以下是我的相关代码:
在AppDelegate
内,我有以下内容:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if !NSUserDefaults.standardUserDefaults().boolForKey("isNotFirstLaunch") {
//Set switchState to false and isNotFirstLaunch to true
NSUserDefaults.standardUserDefaults().setBool(false, forKey: "switchState")
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isNotFirstLaunch")
//Sync NSUserDefaults
NSUserDefaults.standardUserDefaults().synchronize()
}
在UITableViewController
内:
override func viewDidLoad() {
//this line below is commented out because I don't have a reference to the UISwitch in question, but I imagine it would be something along these lines:
//switchState.on = NSUserDefaults.standardUserDefaults().boolForKey("switchState")
}
//This block of code I was able to connect to the UISwitch directly in the storyboard file, so I know this works.
@IBAction func stateChanged(withSwitchState switchState: UISwitch) {
if switchState.on {
NSUserDefaults.standardUserDefaults().setBool(switchState.on, forKey: "switchState")
} else {
NSUserDefaults.standardUserDefaults().setBool(switchState.on, forKey: "switchState")
}
}
在我的课堂上为原型细胞:
class SwitchTableViewCell: UITableViewCell {
@IBOutlet weak var switchControl: UISwitch!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.switchControl.layer.cornerRadius = 16
}
}
我需要对我的UISwitch
类中的原型单元格中包含的UITableViewController
的引用,以便它的初始状态设置为false,如我{{{1}中所建立的那样。 1}} class,只要用户更改AppDelegate
的状态,就会继续保持状态。
答案 0 :(得分:1)
喜欢
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as SwitchTableViewCell
if !NSUserDefaults.standardUserDefaults().objectForKey("switchState")
{
cell. switchControl.setOn(true, animated: true)
}
else
{
cell. switchControl.setOn(false, animated: true)
}
cell. switchControl.tag = indexPath.row
cell. switchControl.addTarget(self, action: "switchChanged:", forControlEvents: UIControlEvents.ValueChanged)
return cell
}
func switchChanged(mySwitch: UISwitch) {
if switchState.on {
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "switchState")
} else {
NSUserDefaults.standardUserDefaults().setBool(false, forKey: "switchState")
}
self.tableview.reloadData()
}
答案 1 :(得分:1)
在故事板中,为UISwitch
设置标记,例如1
。然后,在viewDidLoad
中,使用tableView.cellForRowAtIndexPath(someIndexPath)
let cell = tableView.cellForRowAtIndexPath(<insert your cell's index path here>)
然后,获取UISwitch
:
let mySwitch = cell.viewWithTag(1) as! UISwitch
mySwitch.on = ...
替代方法:
将您从cellForRowAtIndexPath
获得的单元格转换为SwitchTableViewCell
,然后直接访问switchControl
如果您的整个视图控制器是表单,则可以使用Eureka来简化代码。
答案 2 :(得分:0)
只需将此methpd放入您的自定义单元格类中即可。
class func cellForTableView(tableView: UITableView, atIndexPath indexPath: NSIndexPath) -> SwitchTableViewCell {
let kSwitchTableViewCellIdentifier = "kSwitchTableViewCellIdentifier"
tableView.registerNib(UINib(nibName: "SwitchTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: kSwitchTableViewCellIdentifier)
let cell = tableView.dequeueReusableCellWithIdentifier(kSwitchTableViewCellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell
return cell
}
并在tableViewController的cellForRowAtIndexPath
方法中访问单元格,如下所示
let cell = SwitchTableViewCell.cellForTableView(tableView, atIndexPath: indexPath)
现在你可以像这样访问你的swicth
cell.switchControl.... // do something