2015-05-17 2 views
4

Я создал простой каркас для какао с раскадровкой. В моих рамках у меня есть диспетчер представлений MainViewController.swift. Я создал новый проект с одним представлением, импортировал мою фреймворк и попытался загрузить диспетчер просмотра рамки, но у меня появился черный экран. И я не знаю, почему.Как показать мой каскадный тачскринский экран раскадровки?

Я попытался рамки нагрузки с этим кодом:

let frameworkScreen : UIViewController = MainViewController() 
    self.presentViewController(frameworkScreen, animated: true, completion: nil) 
+0

Проблема заключается в том, что 'MainViewController()' создает контроллер вида, но не сообщает этому контроллеру, откуда его получить. Таким образом, представление пустое и черное. Вы говорите, что в вашем каркасе есть раскадровка, но вы не используете эту раскадровку. – matt

+0

Спасибо, но как я могу использовать свою раскадровку? – just

+0

Я покажу вам, на минутку. – matt

ответ

25

Вам нужно загрузить контроллер представления по инстанцированию его из раскадровки в рамках.

Вот как это сделать. Сначала начальные условия:

  • Предположим, что ваш фреймворк называется Coolness.

  • Допустим, раскадровка вашего фрейма называется CoolnessStoryboard.storyboard.

  • Предположим, что у вашей рамки есть класс public под названием CoolnessViewController.

  • Предположим, что CoolnessStoryboard имеет сцену, контроллер вида которой является CoolnessViewController, и что это его начальный контроллер.

Затем в основном коде, который вы бы import Coolness и представить свою CoolnessViewController из раскадровки, вы бы сказали:

let s = UIStoryboard (
    name: "CoolnessStoryboard", bundle: NSBundle(forClass: CoolnessViewController.self) 
) 
let vc = s.instantiateInitialViewController() as! UIViewController 
self.presentViewController(vc, animated: true, completion: nil) 

Примечания стратегии здесь. Работайте назад от цели. Нам нужен экземпляр CoolnessViewController, который является в раскадровке. Чтобы получить это, нам нужна ссылка на эту раскадровку. Для этого нам нужно определить эту раскадровку. Как? Мы можем идентифицировать его по имени и связке, в которой он находится. Но как мы можем идентифицировать этот пакет? Мы можем идентифицировать расслоение с помощью класса в этом расслоении. У нас есть такой класс, потому что мы импортировали фреймворк (import Coolness) и класс public (чтобы мы могли говорить об этом).

+0

Итак, я попробовал ваш код, но получил следующее: Завершение приложения из-за неотображенного исключения «NSInvalidArgumentException», причина: «Не удалось найти раскадровку с именем« Storyboard »в пакете NSBundle ... Мое имя фрейма - MyTestFramework (я импортировал это), мое имя раскадровки рамки - это Storyboard.storyboard, а мой контроллер представления структуры - MainViewController – just

+0

ohh, я нашел решение! У меня был диспетчер навигации в моей рамке раскадровки ... – just

+0

Правильно, мой ответ показывает вам технику, но применение ее к вашей конкретной ситуации зависит от вас! Вот почему я так точно описал свои «начальные условия». – matt

7

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

1 - я основа под названием «Messenger.framework»

2 - Внутри, у меня есть раскадровка файл под названием «Messenger.Storyboard»

3- Мой контроллер начального представления - это UINavigationController с rootViewController и моим ChatController.

Так вот как представить свой чат в Framework UIViewController:

- (void)presentChatController 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Messenger" 
                 bundle:[NSBundle bundleForClass:ChatController.class]]; 

    ChatController *controller = [storyboard instantiateViewControllerWithIdentifier:@"Chat"]; 
    [self.navigationController pushViewController:controller animated:YES]; 
} 

Я надеюсь, что это поможет вам.

+0

, где назвать этот presentChatController? Я вызвал этот метод в viewDidAppear(), но он вызван несколько раз. – poojathorat

+0

Вы называете это, когда хотите представить новый контроллер. Вы можете вызвать его, когда пользователь нажимает кнопку, например. – rcmcastro

2

Если ваше имя рамки MyFramework и раскадровка имя Main с viewcontoller с раскадровки ид vc

if let urlString = NSBundle.mainBundle().pathForResource("MyFramework", ofType: "framework", inDirectory: "Frameworks") { 
    let bundle = (NSBundle(URL: NSURL(fileURLWithPath: urlString))) 
    let sb = UIStoryboard(name: "Main", bundle: bundle) 
    let vc = sb.instantiateViewControllerWithIdentifier("vc") 
    self.showViewController(vc, sender: nil) 
} 

Я Inculded рамки с помощью cocoapods.

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