2016-05-28 5 views
6

Mi chiedevo se esistesse un modo corretto per cancellare lo scorrimento a sinistra su una cella tableview in modo che si spostasse indietro per nascondere i pulsanti. Non sono proprio sicuro di come dirlo correttamente, lol. Ma per favore vedi la GIF qui sotto. Nel primo GIF non ho codice dopo aver premuto il pulsante Annulla, e i pulsanti rimangono visibili.Annulla strisciare a sinistra nella cella tableview quando mostra più pulsanti in rapido

enter image description here

L'unica idea che ho avuto è stato quello di ricaricare il cellulare con questo codice self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) Ma questo dà un aspetto dei pulsanti di spostamento su, mentre io preferirei che appaia i turni di cellule backup in posizione per la destra. Vedi la GIF di ricarica qui sotto.

enter image description here

Come dovrei fare questo in modo corretto? Vedi sotto per il mio codice che aggiunge i pulsanti e quali sono le loro funzioni.

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { 

    let edit = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "Edit") { 
     (action, indexPath) in 

     if (indexPath == self.indexSelect) { 
      print("Editting Selected Cell") 
     } else { 
      print("Editting a difference cell than selected") 
     } 

     let section: Sections = self.frc.objectAtIndexPath(indexPath) as! Sections 
     let count: Int = self.sectionCount(section.section!) 
     var msg: String? 
     let sectionName: String = section.section! 

     if (count > 0) { 
      msg = "There are \(count) other Items using this Section currently. Editing the Section name \"\(sectionName)\" will affect them all. \n\nThis will be changed immediately!" 
     } 

     let alert = UIAlertController(title: "Edit Section Name", message: msg, preferredStyle: UIAlertControllerStyle.Alert) 
     let editAction = UIAlertAction(title: "Edit", style: UIAlertActionStyle.Destructive) { 
      UIAlertAction in 

      let sectionName = Util.trimSpaces(alert.textFields![0].text!) 

      if (sectionName != section.section) { 
       if (Util.checkSectionName(sectionName, moc: self.moc!) == false) { 
        let entityDesc = NSEntityDescription.entityForName("Sections", inManagedObjectContext: self.moc!) 
        let newSection: Sections = Sections(entity: entityDesc!, insertIntoManagedObjectContext: self.moc) 
        newSection.section = sectionName 

        do { 
         try self.moc!.save() 
        } catch { 
         fatalError("New item save failed") 
        } 

        let oldSection: Sections = section 

        let fetchReq = NSFetchRequest(entityName: "Catalog") 
        let pred = NSPredicate(format: "sections.section == %@", oldSection.section!) 
        fetchReq.predicate = pred 

        do { 
         let results = try self.moc!.executeFetchRequest(fetchReq) 
         for rec in results { 
          let catalog: Catalog = rec as! Catalog 
          catalog.sections = newSection 
         } 

         do { 
          try self.moc!.save() 
         } catch { 
          fatalError("Failed to Save after Delete") 
         } 
        } catch { 
         fatalError("Fetching Items to delete section failed") 
        } 

        self.moc!.deleteObject(oldSection) 

        do { 
         try self.moc!.save() 
        } catch { 
         fatalError("Failed to Save after Delete") 
        } 
       } else { 
        Util.msgAlert("Duplicate Section Name", msg: "\"\(sectionName)\" section name already exists.", curVC: self) 
        self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
       } 
      } else { 
       self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
      } 
     } 
     let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { 
      UIAlertAction in 

      //self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
     } 

     alert.addAction(editAction) 
     alert.addAction(cancel) 
     alert.addTextFieldWithConfigurationHandler { 
      (txtFld) -> Void in 

      txtFld.text = section.section 
      txtFld.autocapitalizationType = UITextAutocapitalizationType.Words 
      txtFld.autocorrectionType = UITextAutocorrectionType.Default 
      txtFld.clearButtonMode = UITextFieldViewMode.WhileEditing 
     } 

     self.presentViewController(alert, animated: true, completion: nil) 
    } 

    edit.backgroundColor = UIColor.init(red: 84/255, green: 200/255, blue: 214/255, alpha: 1) 

    let delete = UITableViewRowAction(style: .Destructive, title: "Delete") { 
     (action, indexPath) in 

     let section: Sections = self.frc.objectAtIndexPath(indexPath) as! Sections 
     let count: Int = self.sectionCount(section.section!) 

     if (count > 0) { 
      let alert = UIAlertController(title: "Confirm Delete", message: "There are \(count) Items using this Section currently. Deleting this Section will reset them all to blank. \n\nThis can't be undone and will take affect immediately!", preferredStyle: UIAlertControllerStyle.Alert) 
      let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { UIAlertAction in } 
      let deleteAction = UIAlertAction(title: "Delete", style: UIAlertActionStyle.Destructive) { UIAlertAction in 
       var blankSection: Sections? 

       var fetchReq = NSFetchRequest(entityName: "Sections") 
       var pred = NSPredicate(format: "section == %@", "") 
       fetchReq.predicate = pred 

       do { 
        let results = try self.moc!.executeFetchRequest(fetchReq) 
        blankSection = (results.first as! Sections) 
       } catch { 
        fatalError("Fetching blank section failed") 
       } 

       fetchReq = NSFetchRequest(entityName: "Catalog") 
       pred = NSPredicate(format: "sections.section == %@", section.section!) 
       fetchReq.predicate = pred 

       do { 
        let group = try self.moc!.executeFetchRequest(fetchReq) 
        for rec in group { 
         let catalog: Catalog = rec as! Catalog 
         catalog.sections = blankSection 
        } 

       } catch { 
        fatalError("Fetching Items to delete section failed") 
       } 

       self.moc!.deleteObject(section) 

       do { 
        try self.moc!.save() 
       } catch { 
        fatalError("Failed to Save after Delete") 
       } 

       if (self.sectionUpdateProtocol != nil) { 
        self.sectionUpdateProtocol!.sectionUpdate(self, section: blankSection!) 
       } 

       //self.navigationController!.popViewControllerAnimated(true) 
      } 

      alert.addAction(deleteAction) 
      alert.addAction(cancel) 

      self.presentViewController(alert, animated: true, completion: nil) 
     } else { 
      self.moc!.deleteObject(section) 

      do { 
       try self.moc!.save() 
      } catch { 
       fatalError("Failed to Save after Delete") 
      } 
     } 

    } 

    return [delete, edit] 
} 
+0

Date un'occhiata a SWTableViewCell sia per implementare o vedere come lo fanno. https://github.com/CEWendel/SWTableViewCell – sschale

risposta

6

Basta chiamare:

tableView.setEditing(false, animated: true) 
+0

Proprio sul naso, questo è quello che volevo. Grazie! –

+0

Ci vuole un po 'prima che il pulsante Elimina scompaia. C'è un modo per farlo sparire all'istante ?. Ho anche provato a fare quanto sopra nel gestore di completamento di chiudere l'avviso, ma anche questo non funziona. Ho persino impostato l'animazione su FALSE, che ha anche fallito –

+0

@zulkarnainshah so che è tardi, ma potresti provare 'tableView.reloadData()' (Impostazione animata: false, avrebbe dovuto funzionare comunque) –