2015-08-01 3 views
5

В настоящее время я пытаюсь представить контроллер вида с помощью UIPresentationController. Мой вопрос, когда мой пользовательский делегат Переход называетПредставляющий контроллер Nill в переходном делетете

func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? 

я вручаю контроллер является nil вызывая исключение. Я представляю его из контроллера представления, встроенного в контроллер навигации, который встроен в контроллер панели вкладок. Я попытался представить его и с этих контроллеров по той же проблеме. Он также работает правильно, когда нет специальной модальной презентации, но моя цель - настроить ее. Я называю это, когда выбрана кнопка, и код представлен ниже. mapTransitionDelegate - это мой настраиваемый делегат, который я сохраняю в свойстве класса. Кроме того, EnlargedMapViewController() инициализируется, чтобы иметь специальную модальную презентацию, так что вызывается мой переходный делегат.

var enlargedMapController = EnlargedMapViewController(); 
enlargedMapController.transitioningDelegate = mapTransitionDelegate; 
presentViewController(enlargedMapController, animated: true, completion: nil); 

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

+0

- это «EnlargedMapViewController», созданный в Interface Builder? Если да, это обычная ловушка. Используйте «IBOutlet», а не создавайте экземпляр программно. – vadian

+0

EnlargedMapViewController() создается все в коде. Тем не менее, мое приложение опирается на раскадровки, главным образом, за исключением этого контроллера представления – user2532485

ответ

0

Назначенный инициализатор для UIViewController (и, в свою очередь, его подклассы) равен init(nibName:bundle:). Однако в документации конкретно указано:

Это назначенный инициализатор для этого класса. При использовании раскадровки для определения вашего контроллера представления и связанных с ним представлений, вы никогда не инициализируете свой класс контроллера вида напрямую. Вместо этого диспетчеры создаются с помощью раскадровки либо автоматически, когда segue запускается или программно, когда ваше приложение вызывает метод instantiateViewControllerWithIdentifier: метод объекта раскадровки . При создании экземпляра диспетчера представлений из раскадровки , iOS инициализирует новый контроллер представлений, вызывая его метод initWithCoder: вместо этого метода и устанавливает свойство nibName в файл nib, хранящийся внутри раскадровки.

Вызов EnlargedMapViewController() Неправильный путь, потому что он обходит все необходимые механизмы для какао, чтобы найти кусочки. Вы должны создать экземпляр из ниба, используя его назначенный инициализатор, или, по крайней мере, сопоставив его имя файла nib с его именем класса (т. Е. EnlargedMapViewController.xib), поэтому ваш вызов EnlargedMapViewController(nibName: nil, bundle: nil) (передающий ноль) заставит Cocoa искать подходящий нить по имени.

Но действительно, если вы используете раскадровки повсюду, почему бы и нет? Просто установите идентификатор для своей сцены и используйте instantiateViewControllerWithIdentifier: и наслаждайтесь временем и утомлением, которое вы спасли сами.

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