2017-02-22 4 views
0

初めてSwiftでプログラムを完全にプログラミングしようとしていて、UITableViewを使用して問題に遭遇しました。 私は "exerciseCell"と呼ばれる独自の再利用可能なセルを作成しました。そこにはUIImageviewとUISwitchがあります。再利用可能なテーブルビューのセルは相互作用なしに互いに影響を受けます

私の問題は、行0のスイッチを選択すると3行目と6行目のスイッチがオンに切り替わるということです。これは各セルで同じですが、それぞれ約3セルに影響します。 このテーブルビューの目的は、演習のリストが必要な演習を選択できるようにすることですが、それぞれを個別に選択できる必要があります。ここで

は、セルのためのコードです:また

class exerciseCell: UITableViewCell { 

override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    setupViews() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

var cellSelected:Bool = false 

let excersiseLabel: UILabel = { 
    let label = UILabel() 
    label.translatesAutoresizingMaskIntoConstraints = false 
    label.textColor = UIColor.red 
    label.textAlignment = NSTextAlignment.center 
    return label 
}() 
let excersiseImage: UIImageView = { 
    let image = UIImageView() 
    image.backgroundColor = UIColor.blue 
    image.translatesAutoresizingMaskIntoConstraints = false 
    return image 
}() 

let thisSwitch: UISwitch = { 
    let thisSwitch = UISwitch() 
    thisSwitch.isOn = false 
    thisSwitch.translatesAutoresizingMaskIntoConstraints = false 
    return thisSwitch 

}() 

func setupViews() { 
    addSubview(excersiseLabel) 
    addSubview(excersiseImage) 
    addSubview(thisSwitch) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["v0": excersiseLabel])) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-101-[v0(100)]-101-|", options: .alignAllCenterX, metrics: nil, views: ["v0": excersiseImage])) 
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-120-[v0(100)]-120-|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["v0": thisSwitch])) 

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-12-[v0(30)]-8-[v1(100)]-12-[v2(30)]-12-|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0": excersiseLabel, "v1": excersiseImage, "v2": thisSwitch])) 

} 

}

次のようにcellForRowがある:

私は、細胞が独立して利用者に対応するために取得できますか
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    var thisCell = UITableViewCell() 

    if tableView == self.tableView { 
     let aCell = tableView.dequeueReusableCell(withIdentifier: "thirdCellID", for: indexPath) as! exerciseCell 
     aCell.excersiseLabel.text = "\(mobility[indexPath.row])" 
     aCell.thisSwitch.tag = indexPath.row 
     thisCell = aCell 
    } 
    return thisCell 

} 

?私は明確化のために必要ならば、私のコードをもっと提供することができます。

答えて

3

セルはテーブルビューで再利用されるため、スイッチ設定は保持されません。どのセルが選択されたかを追跡するためには、外部構造が必要です。

セルは、スイッチが切り替えられたとき(おそらく委任によって)、コントローラがあなたの(たとえば)BOOLの配列を更新することを知らせる必要があります。

次に、cellForRowAtIndexPathに、正しい値をセルに適用するためのコードが必要です。次のようなものがあります。

cell.switch.isOn = cellSwitchStates[indexPath.row] 
0

これはuitableviewcellに表示される一般的な問題です。この問題を解決する最善の方法は、オブジェクトでセルを構成することです。

たとえば、あなたの場合、テーブルビューでエクササイズのリストを表示する必要があります。 したがって、ブール変数(例:var switchState: Bool)を使用してエクササイズ用の1つのモーダルクラスを作成します。

class Exercise: NSObject { 

    var exerciseName : String? 
    var switchState : Bool = false 

    init (exerciseName : String?,switchState : Bool) { 
     super.init() 
     self.exerciseName = exerciseName 
     self.switchState = switchState 
    } 
} 

そして偽デフォルトswitchState値と運動オブジェクト(例えばvar exercises : [Exercise])の配列を移入。

は、次にテーブルビューのnumberofrowsは、演習の配列から取られた...リターンexercises.countをカウントし、cellForRowAt indexPath

は今、私たちが正しいオブジェクト権を持って、練習配列例えば:var exercise = exercises[indexpath.row]から正しいエクササイズオブジェクトを取りますか?そうだから、cellForRowAt indexPathからこのセルメソッドを呼び出すと、例えば、パラメータとして

を私たちの運動のオブジェクトを渡し (あなたのケースでは、セルaCellになります)、カスタムセル内の一つの方法fun configureCellWith(exercise:Exercise)を作成:exerciseCell内aCell.configureCellWith(exercise) とあなたのconfigureCellWith()メソッドは、この

// Write this method within exerciseCell 
func configureCellWith(exercise:Exercise) { 

privateExercise = exercise // privateExercise is a private Variable for exerciseCell so please create private var privateExercise : Exercise in exerciseCell 

thisSwitch.isOn = exercise.switchState 

} 

のようにする必要があります次に、スイッチを行ってください。..今ではすべてが正常に見える

thisSwitch.addTarget(self, action: Selector("switchTriggered:"), forControlEvents: .ValueChanged); 


func switchTriggered(sender: AnyObject) { 

    let switch = sender as! UISwitch 
    privateExercise.switchState = switch.isOn 

} 

exerciseCell内でご使用のスイッチのための1つのアクションメソッドを作成します。行0をON/OFFし、他の行に影響を与えるかどうかをチェックします。ありがとう。

+0

ありがとうございました@Aby、これはお互いに影響を与えないようにしましたが、テーブルビューでスクロールしてからスクロールバックすると、スイッチはオフの位置に戻ります。 私はprivate変数を正しく実行していないかもしれません。私はexerciseNameを割り当てないというエラーを出し続けましたので、名前を ""に初期化しました。 – EtherCode

+0

switchTriggeredメソッドが認識されないためです。私は印刷物(スイッチトリガー)を関数に入れましたが、決して表示されません。セレクタのスタイルは正しいですか? – EtherCode

関連する問題