试图在Swift中设置UISwitch的初始状态

时间:2016-09-29 04:55:28

标签: ios swift uitableview uiswitch

我有一个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的状态,就会继续保持状态。

3 个答案:

答案 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