简体   繁体   中英

Disable all UIButtons in UITableViewCell once a separate UIButton is pressed

Problem I've found some questions asking how to disable a particular cell button in a table view, but what I want to do is to disable all instances of a button within a table view cell when another button is pressed.

Details I have a table view which is displaying a list of exercises and number of reps in a custom cell. Within the custom cell is also a button "swap" which allows a user to swap an exercise for another one before the workout starts.

When the user hits "start workout" (which triggers a timer) I want to disable all instances of the swap button (grey them all out and make non clickable).

Code

My workout cell class is here :

class WorkoutCell : UITableViewCell {

    var delegate: WorkoutCellDelegate?

    @IBAction func swapButtonPressed(_ sender: Any) {
        delegate?.swapButtonTapped(cell: self)
    }

    @IBOutlet weak var exerciseName: UILabel!
    @IBOutlet weak var repsNumber: UILabel!
    }
    protocol WorkoutCellDelegate {

        func swapButtonTapped(cell: WorkoutCell)

        }

What have I tried

The way I thought to do this was to add an IBOutlet (eg 'swapButton') for the button and then simply do something like :

   @IBAction func startButtonPressed(_ sender: UIButton) {
       WorkoutCell.swapButton.isenabled = false
    }

But Xcode doesn't allow you to add IBOutlets to repeating cells so I'm a bit stuck.

I'm fairly new to delegates (managed to get it working for displaying the table view) so if it has something simple to do with that sorry!

Add a property to your viewcontroller:

var swapButtonsDisabled : Bool = false

In your cellForRow do something like this:

cell.swapButton.isEnabled = !self.swapButtonsDisabled

When the start button is pressed, set swapButtonDisabled to true and reload the tableView.

1- As you connect

@IBOutlet weak var exerciseName: UILabel!

create outlet for every btn

@IBOutlet weak var btn1: UIButton!

2- Add a property to the model array in the VC to hold the state of every cell

3- When you click the main btn fire the delegate method with the btn's cell

4- In VC delegate handle method disable the btns and change the state of the array index path

5- Don't forget to check state in cellForRow

You are pretty close. First I suggest you to be more specific and have the data you need in cell and use access control:

class WorkoutCell : UITableViewCell {

    var workoutSwappable: (workout: Workout, canBeSwapped: Bool)? {
       didSet {
           swapButton.isEnabled = workoutSwappable?.canBeSwapped == true
           // TODO: do additional setup here
       }
    }

    weak var delegate: WorkoutCellDelegate? // Needs to be weak or you will have memory leaks

    @IBAction private func swapButtonPressed(_ sender: Any) {
        if let workoutSwappable = workoutSwappable, workoutSwappable.canBeSwapped == true {
            delegate?.workoutCell(self, didTapWorkoutSwap: workoutSwappable.workout)
        }
    }

    @IBOutlet private var exerciseName: UILabel!
    @IBOutlet private var repsNumber: UILabel!
    @IBOutlet private var swapButton: UIButton!
    }

Ok so now in cell for row at index path all you need is something like:

cell.workoutSwappable = (self.items[0], self.canSwap)

On delegate you now have:

func workoutCell(_ sender: WorkoutCell, didTapWorkoutSwap workout: workout) {
    self.currentWorkout = workout
    self.canSwap = false
    self.initializeTimer()
    tableView.reloadData() // This will now flush all the buttons
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM