2016-09-29 23 views
0

UITableViewCellのサブクラスであるPrototypeセルに含まれているUISwitchがあります。このプロトタイプのセルにはUISwitchが含まれています。この初期状態は、アプリが最初に起動するときにfalseに設定したい場合と、ユーザーが変更するたびに状態を保存したい場合です。私の問題は、UISwitchがプロトタイプのセルの中に含まれているときに、UITableViewControllerからUISwitchへの参照を取得しようとしています。私は以下の持っている私のAppDelegateインサイドSwiftでUISwitchの初期状態を設定しようとしています

:ここ

は私の関連するコードであるインサイド

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への参照が必要です。AppDelegateクラスの初期状態はfalseに設定されています。 UISwitchの状態です。

+0

のようなあなたのswicthがcellforrow方法はどのよう –

+0

内部の状態を設定するアクセスすることができ

let cell = SwitchTableViewCell.cellForTableView(tableView, atIndexPath: indexPath) 

次のように「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 mySwitch = cell.viewWithTag(1) as! UISwitch 
mySwitch.on = ... 

別のアプローチ:

let cell = tableView.cellForRowAtIndexPath(<insert your cell's index path here>) 

を次に、UISwitchを得る

  • あなたはcellForRowAtIndexPathからSwitchTableViewCellになったセルをキャスト、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メソッドのアクセスセル中の今、あなたは、単にこの

cell.switchControl.... // do something 
関連する問題