2014-10-22 4 views
0

Я использую XCode 6, ориентируясь на iOS 8 и кодируя это в Swift.Segue не выполняется iOS8

Мои контроллеры раскадровки выглядеть следующим образом:

Tab Bar > Navigation > Table View > Detail View 

Show Detail является переход от Table Cell к Detail View.

Метод prepareForSegue не срабатывает при нажатии на ячейку таблицы. Однако Segue от кнопки до мелочей прекрасно работает. performSegueWithIdentifier в didSelectRowAtIndexPath также хорошо работает.

Я также создал совершенно новый тестовый проект, чтобы проверить этот вопрос - код управления выглядит следующим образом:

import UIKit 

class TestTableController: UITableViewController 
{ 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return 2; 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let cellId = "testCell"; 
     var cell: UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellId) as? UITableViewCell; 

     if (cell == nil) 
     { 
      cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellId); 
     } 

     cell!.textLabel!.text = "cell \(indexPath.item)"; 

     return cell!; 
    } 
} 

Любая идея, почему это не работает из коробки?

P.S .: при использовании Split View вместо Tab Bar, тот же сегмент отлично работает.

+0

Убедитесь, что вы используете Xcode 6/iOS 8.1, так как у меня было множество проблем с segues (особенно разматывайте segues) в 8.0.x, но теперь все они исправлены. – Rog

ответ

0

Я только что протестировал его с образцом проекта. Он работает нормально. Должно быть что-то не так с вашей проводкой вверх по ячейке.

Вот мой код. Указывает только изменения из простого шаблона проекта панели табулатуры.

enter image description here

// FirstViewController.swift 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 2 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell 
    cell.textLabel?.text = "Cell \(indexPath.row + 1)" 
    return cell 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let detail = segue.destinationViewController as DetailController 
    let cell = sender as UITableViewCell 
    let indexPath = self.tableView.indexPathForCell(cell) 
    detail.detailItem = "Cell \(indexPath!.row + 1)" 
} 

//DetailController.swift 
class DetailController: UIViewController { 

    var detailItem : String! 
    @IBOutlet var label : UILabel! 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     label.text = detailItem 
    } 
} 
+0

Да, это именно то, что я сделал ... Как это выглядит в XML раскадровки? Вы используете iOS 8.0 или 8.1? XCode 6.0 или бета? – JMicro

+0

6.0.1, 8.0. Не читал XML - просто сделал очевидный материал. – Mundi

+0

Я удалил идентификатор ячейки, установил его снова в IB до того же значения, и он начал работать (WTF?) ... Отмечено, что ваш ответ правильный, потому что вы подтвердили, что с моим кодом нет ничего плохого и заставили меня побеседовать с клетка. – JMicro

0

для вызова метода prepareForSegue вы должны иметь, чтобы добавить SEGUE для подключения ячейки прототипа и контроллер назначения! метод не вызывается, если вы программно перемещаетесь к контроллеру назначения!

+0

Фактически, 'prepareForSegue' действительно вызывается, даже если вы' performSegue' программно. Я хочу, чтобы он работал без программного вызова 'performSegue', как и должно было ... – JMicro

1

Это произошло со мной, когда я регистрировал ячейку в методе ViewDidLoad, используя tableView.register(AnyClass?, forCellReuseIdentifier: String) Когда я прокомментировал эту строку и добавил класс ячейки и идентификатор ячейки в раскадровке, он начал работать. Опять же, если я раскомментирую этот код в viewdidload, он перестает работать.

+0

Это указывало мне в правильном направлении. Я переключился с реализации xib на раскадровки, и я все еще использовал xib пользовательской ячейки вместо того, чтобы определить ее как прототип. –

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