2015-12-31 3 views
0

Я пытаюсь отправить данные из одной таблицы в viewController A для просмотраController B. Однако всякий раз, когда я пытаюсь, я получаю сообщение об ошибке Unexpectedly found nil.UITable DidSelectRowAtIndexPath не отправляет данные через segue (Неожиданно найдено нуль)

У меня есть все мои данные в массиве класса данных, который вызывается и записывается в ячейки таблицы, я тогда есть SEGUE, который должен пройти через данные selectedCell через к вар во 2-й ViewController под названием cellData

if segue.identifier == "viewMemorySegue" { 
      let viewMemoryVC = segue.destinationViewController as! memoryViewierViewController 
      viewMemoryVC.cellData = selectedCell! 
     } 

Я тогда didSelectRow функцию, которая устанавливающее данные selectedCell, а затем performing segue

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    selectedCell = cacheData[indexPath.row] 
    tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    performSegueWithIdentifier("viewMemorySegue", sender: self) 
} 

Я устал print(cellData.memoryTitle) Wi тонкую функцию didSelect, чтобы увидеть, было ли это ноль, однако она печатала правильные данные.

Im новое для Xcode и быстрое поэтому вся помощь приветствуется !!!

GitHub Project Link https://github.com/Matthammond96/Relive

+0

почему Tableview. deselectRowAtIndexPath (indexPath, animated: true) должен быть -> tableView.selectRowAtIndexPath (indexPath, animated: true) – Khuong

+0

@ khuong291 приветствует, изменит это, однако он не исправил проблему с nil :( –

+0

Вы должны сохранить выбранные данные ячейки в частной собственности, которая должна быть сильной, а затем использовать ее для передачи data – Anand

ответ

3

У вас есть SEGUE выбор, установленный в раскадровку, который установлен, чтобы открыть MemoryViewerViewController, и я не см. делегат, установленный в FindCacheViewController, поэтому ваша функция didSelectRowAtIndexPath не вызывается, поэтому ... ваше свойство selectedCell не установлено.

enter image description here

Я хотел бы удалить раскадровки SEGUE, что у вас есть, установить делегат правильно, а затем он должен работать.

Я добавил выход печати в файл didSelectRowAtIndexPath, и он так и не был вызван.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("TEST") 
     selectedCell = cacheData[indexPath.row] 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
     //performSegueWithIdentifier("viewMemorySegue", sender: self) 
    } 

Как вы заметили, я также закомментировал вызов performSegueWithIdentifier метода и переход по-прежнему пытался произойти из раскадровки Segue у вас есть.

+0

Если я удалю часть отправки данных из сегмента, она выполнит segue, –

+0

Да, это из-за того, что у вас есть настройка раскадровки. В принципе у вас есть два способа активации segue в данный момент. Только один из них устанавливает данные, но никогда не вызывается. – Scriptable

+0

Хорошо, также должно быть DeSelect или Select ?, Выбрать правильно? –

1

Если данные глобальна, вы не должны объявить его в VC B, если он является локальным в стороне VC A, то вы должны объявить его в VC B. Затем в вашем VC B создайте var selectedIndexPath: NSIndexPath?. Затем в вашем VC A создайте var selectedIndexPath: NSIndexPath?. Затем в didSelectRowAtIndexPath функции отправки выбранного пути индексный selectedIndexPath как это tableView.indexPathForCell(cellFromDelegateMethod)

А потом

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "viewMemorySegue" {    
     let viewMemoryVC = segue.destinationViewController as! memoryViewierViewController 
     viewMemoryVC.selectedIndexPath = selectedIndexPath! 
    } 
    } 
+0

Он использует TableView не collectionView. – NSNoob

+0

забыли, еще раз проверьте – Khuong

+0

Неправильный метод делегата mate – NSNoob

0

Рассмотрим следующий код:

Первый View Controller, который с точки зрения таблицы:

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    private var cellData: String! 
    //MARK - TableViewDatasource 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 5 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell") 
     cell?.textLabel?.text = "data \(indexPath.row)" 
     return cell! 
    } 

    func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { 
     let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 
     self.cellData = cell.textLabel?.text 
     performSegueWithIdentifier("AnotherViewControllerSegue", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
      let destinationVC : AnotherViewController = segue.destinationViewController as! AnotherViewController 
      destinationVC.data = self.cellData; 
     } 
    } 

Далее, другой View Controller со свойством удерживать данные

class AnotherViewController: UIViewController { 
    var data:NSString! 
     override func viewDidLoad() { 
     super.viewDidLoad() 
      NSLog(self.data as String) 
    } 
} 
+0

Какая разница между этим и тем, что у меня есть, каковы преимущества и т.д? –

+2

Я проверил его код и не нашел кода, что когда-либо было в UITableView, поэтому я подготовил свой ответ на основе некоторых допущений. Хотя этот метод также будет работать, принятый ответ также верен. Если вы используете статическую ячейку, он может непосредственно сделать segue другому контроллеру представления из этой ячейки, но если вы используете динамическую ячейку, ему нужно будет создать общий сегмент и использовать метод performSegueWithIdentifier. – Anand

Смежные вопросы