Не работает segue


#1

Здравствуйте. Добавил еще один TableViewController в проект, пытаюсь назначить переход при нажатии ячейки в этот контроллер. Делал как в 2 курсе 9 уроке. Добавил контроллер, зажал CTRL и перетащил курсор с ячейки на тот самый контроллер. Задал идентификатор. При нажатии ячейки ничего не происходит. Иконка > есть.


#2

Посмотрите пожалуйста момент на 10:17 есть такая строка в коде?


#3

такой строки нет, но она вроде бы для отображения картинки?


#4

Что у Вас происходит при нажатии на ячейку? А еще будет хорошо, если покажете код.


#5

ничего. Может ли быть дело в настройке самой ячейки?


#6

Нет, не в настройке дело.
Покажите пожалуйста код.


#7

Главный котнроллер, в котором отображаются ячейки:

   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)
        }
    }
}

#8

Не вижу метода tableView:didSelectRowAtIndexPath?


#9

Метода нет. Сейчас напишу и запущу.


#10

Этот метод и определяет, что должно происходить при нажатии на определенную ячейку.


#11

В проекте 2 курса все работает без этого метода. Там он закомментирован и пустой. Что нужно вписать?


#12

Там потому что используется метод prepareForSegue. А от ячейки стоит сегвей на следующий ViewController. То есть просто выделяете ячейку CTRL+DRAG и на тот ViewController, который Вы хотите, чтобы всплывал при нажатии на ячейку.


#13

Дело в том что на главном экран хочу сделать одну ячейку, при нажатии на которую осуществляется переход на след.экран со всеми добавлеными ячейками. Какой метод из этих двух лучше использовать?:slight_smile:


#14

Особой разницы на самом деле нет. Какой ближе, тот и используйте. В принципе одинаково кода будет.


#15

Создал метод:

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го курса.


#16

Можете скинуть Ваш проект?


#17

Да. Перепроверял))копировал и вставлял в код.


#18

Но ведь проект под видео рабочий. Значит что-то все таки упускаете :slight_smile:


#19

Делал по видео :slight_smile: . Там же вроде бы элементарно, добавили контроллер, затем CTRL+Drag на него и все. Поэтому не понимаю что еще сделать.

PS В коде бардак, заранее извиняюсь :slight_smile:.


#20

В конец метода viewDidLoad добавьте следующее:

tableView.allowsSelection = true

Затем у Вас выскочит ошибка, что у Вас нет элементов в массиве myCells.
Но это уже другая история. :slight_smile: