web-dev-qa-db-fra.com

Mettre la vue de table en mode édition

J'ai un UITableView dans un UIViewController et j'ai ajouté un bouton d'édition à partir du code plutôt que de l'IB. Cela vient avec UITableViewControllers mais pas les UIVC. Comment puis-je obtenir ce bouton pour mettre la vue de table en mode d'édition dans Swift? Merci d'avance pour votre aide.

class WordsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate  {
  override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.rightBarButtonItem = self.editButtonItem()
  }

  func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return true
  }
}
11
richc

Créez rightBarButtonItem comme ci-dessous avec une action.

Dans viewDidLoad():

let rightButton = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("showEditing:"))
    self.navigationItem.rightBarButtonItem = rightButton

puis faire une fonction comme,

 func showEditing(sender: UIBarButtonItem)
 {
    if(self.tableView.isEditing == true)
    {
        self.tableView.isEditing = false
        self.navigationItem.rightBarButtonItem?.title = "Done"   
    }
    else
    {
        self.tableView.isEditing = true
        self.navigationItem.rightBarButtonItem?.title = "Edit" 
    }
}

Assure-toi, : est ajouté au nom de la fonction dans Selector d'action dans viewDidLoad
J'espère que ça aide!

21
iRiziya

Swift 3 & 4 répondez que IMHO est mieux que les autres réponses:

override func viewDidLoad() {
    super.viewDidLoad()

    let editButton = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(toggleEditing)) // create a bat button
    navigationItem.rightBarButtonItem = editButton // assign button
}

@objc private func toggleEditing() {
    listTableView.setEditing(!listTableView.isEditing, animated: true) // Set opposite value of current editing status
    navigationItem.rightBarButtonItem?.title = listTableView.isEditing ? "Done" : "Edit" // Set title depending on the editing status
}

Pourquoi est-ce que je pense que c'est mieux:

  1. Moins de lignes de code.
  2. Le bouton de barre est initialisé une fois mais pas à chaque fois que vous appuyez sur le bouton.
15
Tung Fam

Voici une solution pour Swift 4.2 :

override func viewDidLoad() {
  super.viewDidLoad()

  // Use the edit button provided by the view controller.
  navigationItem.rightBarButtonItem = editButtonItem
}

override func setEditing(_ editing: Bool, animated: Bool) {
    // Takes care of toggling the button's title.
    super.setEditing(!isEditing, animated: true)

    // Toggle table view editing.
    tableView.setEditing(!tableView.isEditing, animated: true)
}

Le contrôleur de vue setEditing est appelé par défaut lorsque vous appuyez sur editButtonItem. Par défaut, appuyez sur le bouton pour basculer son titre entre "Modifier" et "Terminé", appelant ainsi super.setEditing s'en charge pour nous, et nous utilisons la méthode tableView de setEditing pour basculer l'état d'édition de la vue de table.

Sources:

14
Jared Cleghorn

Appelez cette méthode en cliquant sur le bouton.

tableView.setEditing(true, animated: true)

Ou si vous voulez que cela fonctionne comme une bascule

tableView.setEditing(!tableView.editing, animated: true)

Je suppose que vous avez un bouton qui appelle editButtonPressed à la presse. L'implémentation de cette méthode pourrait donc ressembler à ceci.

override func viewDidLoad(){
 navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editButtonPressed"))
}

func editButtonPressed(){
  tableView.setEditing(!tableView.editing, animated: true) 
  if tableView.editing == true{
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editButtonPressed"))
  }else{
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editButtonPressed"))
  }
} 

Cela change également le titre du bouton de la barre.

8
Juri Noga

Remplacez le contrôleur de vue -setEditing:animated:, appelez super et appelez la même méthode sur votre vue de table.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];

    [self.tableView setEditing:editing animated:animated];
}
3
Christian Schnorr

Version Swift 3.0 de njuri post:

override func viewDidLoad() {
    super.viewDidLoad()

    PackageNameLabel.text = detailPackageName
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.plain, target: self, action: #selector(PackageDetailsTableViewController.editButtonPressed))

}


func editButtonPressed(){
    tableView.setEditing(!tableView.isEditing, animated: true)
    if tableView.isEditing == true{
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(PackageDetailsTableViewController.editButtonPressed))
    }else{
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Edit", style: UIBarButtonItemStyle.plain, target: self, action: #selector(PackageDetailsTableViewController.editButtonPressed))
    }
}
1
Mike Kirkwood

Swift4.2 lors de l'édition sur le bouton UI

   //On Button Click
       @IBAction func mEditBtnAct(_ sender: Any) {
        if(self.mtableView.isEditing == true)
        {
            self.mtableView.isEditing = false
            self.mEditBtnOut.setTitle("Edit", for: .normal)
        }
        else
        {
            self.mTimerTablevw.isEditing = true
            self.mEditBtnOut.setTitle("Done", for: .normal)
        }
    }
0
Sukhwinder Singh