1

同様の質問を読みましたが、解決できませんでした。クラスを追加および削除するためのボタンを備えたカスタムセルを持つテーブルビューがあります。クラスを保存して削除し、ボタンの状態を変更するカスタム デリゲートを作成しました。ボタンの状態の変更は正常に機能しますが、スクロール中にボタンが状態を保持しません (セルをデキューしているためだと思います)

インデックスパスの行のセルで、ボタンの状態を変更するためにチェックしようとしました:

let isInSchedule = self.isClassScheduled(classAttend, from: self.classesInSchedule!)
    if isInSchedule == true {
        cell.addRemoveButton.selected = true

    } else {
        cell.addRemoveButton.selected = false
    }

そして、これがクラスを保存または削除するデリゲートメソッドです

 func indexOfClassSelectedWithButton(index: NSIndexPath, tableView:UITableView, and button: AddRemoveClass) {
    if let currentlySavedClasses = ManagedObjectsController.sharedInstance.getAllScheduledClasses() as? [ClassScheduled] {
    let classSelected = self.classes[index.section]
    switch button.selected {
    case true:
            for classItem in currentlySavedClasses {
                if classSelected.presentation?.title == classItem.presentation?.valueForKey("title") as? String {
                    ManagedObjectsController.sharedInstance.deleteScheduledClass(classItem)
                    button.selected = false
                }
            }
        break
    default:
        if let classSelectedBreakout = classSelected.breakout?.valueForKey("breakoutID") as? String {
            let canSave = self.isBreakoutAvailable(classSelectedBreakout, allClasses: currentlySavedClasses)
            if canSave {
                ManagedObjectsController.sharedInstance.createScheduledClass(from: classSelected)
                button.selected = true
            } else {
                NSNotificationCenter.defaultCenter().postNotificationName(timeConlictNotication, object: nil)
            }
        }
      break
    }
    }
}

ボタンの状態を変更しますが、上下にスクロールを開始すると、ボタンの状態が保持されません (おそらく、セルを修正しているため、使用可能なセルを取得しているためです。どんな助けも大いに役立ちます感謝。

また、ストーリーボードのView Controller内にセルがあります。cell = PresentationCell() を実行すると、セル内のすべてのビューが nil になるのはなぜですか? 最後の解決策としてセルを再利用しないようにしています。

4

3 に答える 3

3

再利用可能なテーブル ビュー セルは状態を保持しないため、ボタンの状態を保持するには、セルが画面に表示されるときに条件に基づいて別のチェックを行う必要があります。私の提案は実装です

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if isInSchedule == true {
    cell.addRemoveButton.selected = true

} else {
    cell.addRemoveButton.selected = false
}

}

別のことは、カスタムセルに「prepareForReuse」を実装することにより、使用する前にセルのリセット状態を覚えておくことです。

override func prepareForReuse() {

}

これが助けになることを願っています。

于 2016-03-10T02:23:32.333 に答える
0

解決策は@Michaelから来ました「必要な状態はセルの外で維持する必要があります」というのは、tableViewがすでに作成されているセルを再利用するためです何でもかまいません)、そのプロパティに基づいて、メソッド cellForRowAtIndexPath でボタンの状態を設定します。

于 2016-03-10T04:07:43.957 に答える
0

あなたは2つのことをするべきです

  1. UITableViewCell サブクラスで「prepareForReuse」をオーバーライドして、テーブルビュー セルをデフォルトの状態にリセットします
  2. tableView:cellForRowAtIndexPath: では、再利用可能なセルをデキューします。そのセルは再利用されており、既に別の indexPath に関連付けられている可能性があるため、再構成する必要があります。あなたの場合、セルを割り当てようとしている indexPath を反映するようにボタンの状態を設定します
于 2016-03-10T02:29:07.417 に答える