2015-11-26 3 views
0

Когда я переопределить func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?), я получаю контроллер представления назначения черезподклассов в раскадровке

let viewController = segue.destinationViewController as! VehicleDetailViewController 

прекрасно работает до сих пор.

Но как я могу подставить VehicleDetailViewController с некоторым подклассом SomeDetailViewController, т.е. CarDetailViewController или BikeDetailViewController?

Так что код (фрагмент) должен выглядеть

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "SegueID" { 
     let indexPath = tableView.indexPathForSelectedRow! 
     let vehicle = Vehicle[indexPath.row] 
     switch vehicle { 
     case is Car: 
      let viewController = segue.destinationViewController as! CarDetailViewController 

     case is Bike: 
      let viewController = segue.destinationViewController as! BikeDetailViewController 
     } 
    } 
} 

но Xcode говорит мне, что бросок не допускается:

Не удалось бросить значение типа 'SomeApp.VecicleDetailViewController' (0x10ede2220) в «SomeApp.CarSensorDetailViewController» (0x10ede2310).

Также помощь в Objective-C приветствуется, потому что вопрос не связан с языком.

+0

Почему не попробовать случай 0, случай 1 вместо объектов? –

+0

Речь идет не о коммутационном футляре (он отлично работает), проблема в том, что это отличная от 'VehicleDetailViewController' его подкласс' CarDetailViewController'. –

+1

может отправить код, связанный с ошибкой? i.e код с CarSensorDetailViewController –

ответ

2

Сег создает экземпляр определенного класса. Если вам нужно несколько подклассов SomeDetailViewController, вам нужно будет развернуть несколько viewControllers в вашей раскадровке и создать несколько сегментов.

Вы можете сделать это с помощью управления -dragging от значка ViewController в верхней части ViewController к каждому ViewController, который является подклассом SomeDetailViewController. Затем добавьте идентификаторы к segues и назовите их performSegueWithIdentifier в didSelectRowAtIndexPath.

Другой способ сделать это - создать несколько прототипов для вашего tableView, причем каждый из них подключен к определенному viewController, к которому он переходит.

+0

Я действительно надеялся, что есть еще одно решение, но это, но благодаря вашему ответу. –

+0

Я надеялся на решение только для кода без раскадровки, но все в порядке, Раскадровка, здесь я прихожу. :) –

+1

Для решения только кода, отказаться от segues в целом и сделать это старомодным способом. Создайте новый контроллер представления, заполните его необходимой информацией и нажмите. – vacawama

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