2016-09-26 1 views
1

Привет Я разрабатываю приложение с настраиваемым действием в ячейке tableview.IOS представляет Viewcontroller и передает данные внутри editActionsForRowAt

, когда пользователь провел клетку. Будет выполнено 2 действия: удалить и многое другое. Я хочу больше действий, чтобы представить новый viewController и передать данные объекта новому контроллеру viewController. Как мы это достигаем?

Я попытался с помощью этого

в viewDidLoad

if let split = self.splitViewController { 
      let controllers = split.viewControllers 
      self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController 
     } 

и editActionsForRowAt метод

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

     let moreRowAction = UITableViewRowAction(style: .normal, title: "More", handler:{action, indexpath in 

      if let indexPath = self.tableView.indexPathForSelectedRow { 
       let object = self.fetchedResultsController.object(at: indexPath) 
       let controller = self.detailViewController! 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem 
       controller.navigationItem.leftItemsSupplementBackButton = true 
       self.present(controller, animated: true, completion: nil) 
      } 
//    self.performSegue(withIdentifier: "showDetail", sender: self) 
     }); 
     moreRowAction.backgroundColor = UIColor(red: 0.298, green: 0.851, blue: 0.3922, alpha: 1.0); 

     let deleteRowAction = UITableViewRowAction(style: .destructive, title: "Delete", handler:{action, indexpath in 
      self.deleteTapped(indexPath: indexPath as NSIndexPath) 
     }); 

     return [deleteRowAction, moreRowAction]; 
    } 

функция удаления работа, но чем больше действий не работает. И помощь очень ценится! Благодаря

enter image description here

Мои prepareforseuge

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "showDetail" { 
      if let indexPath = self.tableView.indexPathForSelectedRow { 
      let object = self.fetchedResultsController.object(at: indexPath) 
       let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem 
       controller.navigationItem.leftItemsSupplementBackButton = true 
      } 
     } 
    } 
+0

кого есть идеал? –

+0

Вы используете раскадровки? то есть. вы хотите переходить к новому контроллеру представления? Или вы используете создание контроллера NIB или программного представления? Я вижу, что у вас есть комментарий, так что я догадываюсь о первом? – Paulw11

+0

Привет, да. У меня есть segue с метки tableviewCell. Пытался использовать выполнить segue, но информация не передается новому Viewcontroller. Информация только передается, когда обычный щелчок (не в редактировании swipe) –

ответ

2

Вы можете передать объект с помощью параметра sender вашему Segue:

let moreRowAction = UITableViewRowAction(style: .normal, title: "More", handler:{action, indexpath in 
     let object = self.fetchedResultsController.object(at: indexPath) 
     self.performSegue(withIdentifier: "showDetail", sender: object) 
    }); 

Тогда в prepare(for segue: sender:) -

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "showDetail" { 
     guard let navVC = segue.destination as? UINavigationController, 
      let destVC = navVC.viewControllers.first as? DetailViewController else { 
       return 
     } 

     var object = sender as? Event 
     if object == nil { 
      if let indexPath = self.tableView.indexPathForSelectedRow { 
       object = self.fetchedResultsController.object(at: indexPath) 
      } 
     } 
     destVC.detailItem = object 
    } 
} 

Проект шаблона Master-Detail использует контроллер навигации в качестве пункта назначения детали, поэтому функции prepare(for segue) необходимо получить доступ к контроллеру первого вида контроллера навигации.

Кроме того, так как вы используете один и тот же SEGUE для ряда крана и «больше» действий, мои проверок коды для обоего возможностей - деталь детали может быть отправителем или в выбранной строке

+0

привет спасибо за вашу помощь. Я добавил, что готовлюсь к segue в вопросе. Код из if let ... не является вызовом (может быть, он не может получить tableview.indexPathForselectedRow.Если я перемещаю let obje ... и self.perfomSegue .. снаружи. Он может перейти к новому диспетчеру просмотра, но информация не проходит (получить нуль на переменную нового viewController) –

+0

@ LêKhánhVinh 'moreRowAction' block уже имеет indexPath, почему бы вам по-прежнему «если да», просто проверьте, получил ли источник данных данные на этом indexPath и 'performSegue', это doesn 't звоните, потому что вы не выбираете его – Tj3n

+0

Не информация о том, что информация не перешла на новый Viewcontroller, потому что segue из tableview cell lable (установлен из раскадровки). –