2016-05-28 14 views
6

Zastanawiam się, czy istnieje właściwy sposób anulowania przesunięcia w lewo w komórce tabeli, tak aby przesuwał się z powrotem, aby ukryć przyciski. Nie jestem pewien, jak to poprawnie powiedzieć, lol. Ale zobacz GIF poniżej. W pierwszym GIF nie mam kodu po naciśnięciu przycisku anulowania, a przyciski pozostają widoczne.Anuluj przesunięcie w lewo w komórce widoku tabeli, gdy wyświetlana jest większa liczba przycisków w szybkim tempie.

enter image description here

Jedynym pomysłem było to, aby przeładować komórkę z tym kodem self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) Ale to daje wygląd przycisków przesuwania w górę, natomiast wolałbym go do stawienia się przesunięcia komórkowe kopii na miejsce do dobrze. Zobacz ponownie załadowany GIF poniżej.

enter image description here

Jak powinienem robić to prawidłowo? Zobacz poniżej mój kod, który dodaje przyciski i jakie są ich funkcje.

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

Spójrz na SWTableViewCell albo wdrożyć lub zobaczyć, jak oni to robią. https://github.com/CEWendel/SWTableViewCell – sschale

Odpowiedz

6

Wystarczy zadzwonić:

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

Bezpośrednio na nosie, właśnie tego chciałem. Dziękuję Ci! –

+0

Zniknięcie przycisku usuwania trwa chwilę. Czy istnieje sposób, aby natychmiast zniknął? Próbowałem nawet zrobić powyższe w instrukcji obsługi zakończenia, odrzucając alert, ale to też nie działa. Nawet ustawiłem animację na FALSE, która również nie powiodła się. –

+0

@zulkarnainshah Wiem, że jest późno, ale możesz spróbować 'tableView.reloadData()' (Ustawianie animacji: false, powinno działać) –