IOS 8 - performSegueWithIdentifier загружает представление, но не отображается, пока я не коснусь экрана

У меня есть приложение Tab Bar, и одна из вкладок, которая содержит Table View, переходит в третье представление, когда нажата ячейка таблицы. Контроллер представления действует как делегат для UITableView, и я запускаю segue программно следующим образом:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
 println("cell tapped, starting segue")
 performSegueWithIdentifier("showDetails", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
 println("prep for segue")
 // TODO - more code here
}

Наконец, я настроил следующий код для отладки проблемы с третьим видом:

class DetailsViewController: UIViewController {
 override func viewDidLoad() {
 super.viewDidLoad()
 println("did load")
 }
 override func viewWillAppear(animated: Bool) {
 super.viewWillAppear(animated)
 println("will appear")
 }
}

Проблема заключается в том, что когда я впервые viewWillAppear на viewWillAppear функция viewWillAppear никогда не viewWillAppear до тех пор, пока я не взаимодействую с пользовательским интерфейсом каким-либо образом (например, просто нажмите в любом месте экрана). Представление, которое я хочу перевести, не появляется, как будто экран не обновился. Однако, когда я нажимаю экран, вся анимация запускается, и я могу переходить по своему усмотрению. Это мой вывод, когда я нажимаю на ячейку:

cell tapped, starting segue
prep for segue
did load

Я пытался найти решения в Интернете, но все проблемы, которые я нашел, похоже, просто не работают. В моем случае он работает, но не сразу.

Если это поможет, вот скриншот моей раскадровки:

2 ответа

Сработала аналогичная проблема, имея мой выборStyle =.None. Опция, которую вы можете использовать, если вы похожи на меня, и не хотите, чтобы применяемый метод selectionStyle - это вернуть элемент ячейки в невыбранный в prep для segue. Это, казалось, остановило "проблему", я видел, где segue будет работать отлично один раз, но для всех последующих вызовов потребуется выделить ячейку дважды.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
 //sending the index path up as the sender so the prep for segue can access the cell
 self.performSegueWithIdentifier("segueID", sender: indexPath);
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
 if (segue.identifier == "segueID"){
 if let indexPath : NSIndexPath = sender as? NSIndexPath{
 tableViewReference.cellForRowAtIndexPath(indexPath)?.selected = false;

 let destinationVC : UIViewControllerClass = segue.destinationViewController as! UIViewControllerClass;
 destinationVC.customMethod(/* some value */);

 }
 }
}


Sefu нашел ответ и разместил его в комментариях, я столкнулся с тем же вопросом, и его решение сработало для меня. Хитрость заключается в том, чтобы сделать так, чтобы выбранная ячейка, которая запускает segue, должна иметь набор стилей выбора (не None), и я также обнаружил, что отменить выбор ячейки в tableView: didSelectRowAtIndexPath: также необходимо было выполнить.

licensed under cc by-sa 3.0 with attribution.