2016-09-29 110 views
0

我有一個UISwitch,它包含在原型單元中,該原型單元是UITableViewCell的子類。這個原型單元格包含一個UISwitch,當應用程序最初啓動時,我希望將其初始狀態設置爲false,以及每當用戶更改時希望存儲哪個狀態。我的問題是試圖從UITableViewController中獲得對UISwitch的引用,此時UISwitch包含在原型單元內。嘗試在Swift中設置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,如我的AppDelegate類中所建立的,並且每當用戶更改UISwitch的狀態。

+0

設置狀態在cellforrow方法 –

+0

如何內我在「cellForRowAtIndexPath」中獲得對自定義單元類的引用嗎?當我這樣做: 如果單元格是SwitchTableViewCell { ... } 我無法使用「單元格」來獲取其類中的UISwitch參數的引用。 – syedfa

+0

@syedfa檢查我的答案,以獲得對你的牢房的重視。 –

回答

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() 
} 
+0

檢查更新的答案 –

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 = ... 

替代方法:

  • 投你從cellForRowAtIndexPathSwitchTableViewCell細胞,並直接訪問switchControl

  • 如果您的整個視圖控制器是一個窗體,您可以使用Eureka來簡化您的代碼。

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