Здравствуйте. Добавил еще один TableViewController в проект, пытаюсь назначить переход при нажатии ячейки в этот контроллер. Делал как в 2 курсе 9 уроке. Добавил контроллер, зажал CTRL и перетащил курсор с ячейки на тот самый контроллер. Задал идентификатор. При нажатии ячейки ничего не происходит. Иконка > есть.
Не работает segue
Главный котнроллер, в котором отображаются ячейки:
import UIKit
import CoreData
class WorkTimeTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {
@IBAction func unwindBackTOHomeScreen(segue: UIStoryboardSegue) {
}
lazy var fetchedResultController: NSFetchedResultsController! = {
let fetchRequest = NSFetchRequest(entityName: "WorkTime")
let sortDescription = NSSortDescriptor(key: "differenceHourMin", ascending: true)
fetchRequest.sortDescriptors = [sortDescription]
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
frc.delegate = self
return frc
}()
override func tableView(_: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
//создаем свою кнопку "Удалить"
let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Удалить") { (UITableViewRowAction, NSIndexPath) -> Void in
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let restaurantToRemove = self.fetchedResultController.objectAtIndexPath(indexPath) as! WorkTime
managedObjectContext.deleteObject(restaurantToRemove)
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
let nserror = error as NSError
NSLog("Ошибка \(nserror), \(nserror.userInfo)")
abort()
}
}
}
deleteAction.backgroundColor = UIColor.redColor()
return [deleteAction]
}
override func viewDidLoad() {
super.viewDidLoad()
//получаем БД
do {
try fetchedResultController.performFetch()
} catch {
print(error)
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
navigationController?.hidesBarsOnSwipe = false
}
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case.Delete:
tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
case.Insert:
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
case.Update:
tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
default:
tableView.reloadData()
}
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let numberOfObjects = fetchedResultController.sections?[section].numberOfObjects
return numberOfObjects == nil ? 0 : numberOfObjects!
}
///ячейка для отображения нудной информации из БД
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! WorkTableViewCell
let wt = fetchedResultController.objectAtIndexPath(indexPath) as! WorkTime
cell.nameLabel.text = wt.differenceHourMin!
cell.moneyLabel.text = String(format:"%.2f", wt.money!.floatValue)
cell.dateLabel.text = String(wt.shortDate!)
return cell
}
}
extension UITableView {
@IBInspectable var backgroundImage: UIImage? {
get {
return nil
}
set {
backgroundView = UIImageView(image: newValue)
}
}
}
extension UITableViewCell {
@IBInspectable var backgroundImage: UIImage? {
get {
return nil
}
set {
backgroundView = UIImageView(image: newValue)
}
}
}
Этот метод и определяет, что должно происходить при нажатии на определенную ячейку.
В проекте 2 курса все работает без этого метода. Там он закомментирован и пустой. Что нужно вписать?
Там потому что используется метод prepareForSegue. А от ячейки стоит сегвей на следующий ViewController. То есть просто выделяете ячейку CTRL+DRAG и на тот ViewController, который Вы хотите, чтобы всплывал при нажатии на ячейку.
Дело в том что на главном экран хочу сделать одну ячейку, при нажатии на которую осуществляется переход на след.экран со всеми добавлеными ячейками. Какой метод из этих двух лучше использовать?
Особой разницы на самом деле нет. Какой ближе, тот и используйте. В принципе одинаково кода будет.
Создал метод:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showAllCells" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let destinationVC = segue.destinationViewController as! AllResultsTableViewController
destinationVC.allCells = self.myCells[indexPath.row]
}
}
}
ничего не происходит. Идентификатор сегвея проверял, все нормально. Делал по примеру из 2го курса.
Делал по видео . Там же вроде бы элементарно, добавили контроллер, затем CTRL+Drag на него и все. Поэтому не понимаю что еще сделать.
PS В коде бардак, заранее извиняюсь .
В конец метода viewDidLoad добавьте следующее:
tableView.allowsSelection = true
Затем у Вас выскочит ошибка, что у Вас нет элементов в массиве myCells.
Но это уже другая история.