2017-11-04 4 views
0

私が直面している問題は、おそらく再利用可能なセルという概念の理解の欠如です。私は、30の行を作成し、それぞれにUISwitchがあるとしましょう。UITableViewの使用時にオブジェクトの参照を保持する方法は?

スイッチを切り替えると、その動作が他の29に影響するはずです。ポイントは次のとおりです。私が知る限り、iOSはすべてを一度に作成するのではなく、 TableViewが上下にスクロールされます。

これらの再利用オブジェクトのコピーを保持し、iOSにスイッチに適切な値を設定するように指示するにはどうすればよいですか?

私はに追加セルを有するに思っている[UISwitch]私が見て、そこにすべての30個のセルを持って管理することはできません。

... 

var switches = [UISwitch]() 

... 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Field10Cell", for: indexPath) as! Field10TableViewCell 

    ... 

    //cell.value is a UISwitch 
    if !switches.contains(cell.value) { 
     switches.append(cell.value) 
    } 

    return cell 
} 
+0

"スイッチの1つをトグルすると、その動作は他の29に影響するはずです。これ以上説明できますか? – 3stud1ant3

+0

私はスイッチ1をトグルするとしましょう。それは 'onvaluechanged'です。他の29個のスイッチをすべて無効にしたいのですが、私はそれらのインスタンスをまだ持っていないのでできません。(私は推測します) – Rob

+1

あなたは間違った方法を考えています。 1つのスイッチがトグルされている場合、すべてのスイッチが同じ状態を保持することになっている場合は、現在の状態を保持するブール値のプロパティとIBActionを宣言します。セルのボタンをアクションに接続します。スイッチが値を変更した場合は、ブール値のプロパティを更新し、テーブルビューをリロードし、cellForRow内のスイッチの状態をそれに応じて設定します。 – vadian

答えて

3

あなたが保存セットを作成することができますスイッチが押されたセルのインデックス。そのコンテナのセルの場合だけチェックあなたはスイッチが作動しているかどうかを確認する必要がある場合は

activeSwitches.insert(indexPath) 

、:

ユーザーがセル上のスイッチを押すたびに、あなたはこのようにセットにそれを格納
var activeSwitches = Set<IndexPath>() 

:私はfolliwingをお勧めします、ユーザーが特定のスイッチを押したときに知るために

if activeSwitches.contains(indexPath) { 
    // do something 
} 

:indexPathはそうのような能動スイッチであります

  1. cellForRowAtIndexPathには、現在のindexPathをField10TableViewCellに保存します。
  2. Field10TableViewCellでプロトコルを作成し、デリゲートを追加します。

    protocol Field10Delegate { 
        func didChangeSwitch(value: Bool, indexPath: IndexPath) 
    } 
    
    class Field10TableViewCell { 
        var delegate: Field10Delegate? 
        var indexPath: IndexPath? 
        @IBOutlet weak var fieldSwitch: UISwitch! // Can't use 'switch' as a variable name 
    
        @IBAction func switchValueChanged(_ sender: UISwitch) { 
         if let indexPath = indexPath { 
          delegate?.didChangeSwitch(value: sender.isOn, indexPath: indexPath) 
         } 
        } 
    
  3. あなたはセルを作成し、あなたのビューコントローラは、プロトコルに準拠してくださいデリゲート

    let cell = tableView.dequeueReusableCell(withIdentifier: "Field10Cell", for: indexPath) as! Field10TableViewCell 
    cell.delegate = self 
    cell.indexPath = indexPath 
    
  4. としてビューコントローラを設定します。

上記のいずれの時点でも、スイッチがアクティブであるかどうかを知ることができ、デキューされたセルを処理できますこの情報と一緒に。

+0

これは素晴らしい答えです、ありがとう!私もあなたのブログを楽しんでいます:) – Rob

+1

'== true'は冗長です。'if value {' –

+2

そしてスイッチにIBOutletを追加する必要はありません。代わりに送信者を使用してください。 UISwitchには値のプロパティはありません。 isOnプロパティを使用する必要があります。 'sender.isOn' –

関連する問題