2015-10-05 6 views
0

Я пытаюсь использовать это в моей функции представить контроллер представления после запуска функции, поэтому включил его виспользование presentviewcontroller внутри функции быстрой

let window = UIWindow() 
let rootViewController = window.rootViewController 
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
let setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("EmployeeTBCIdentifier") 
rootViewController?.presentViewController(setViewController, animated: true, completion: nil) 

Это ничего не делает, она работает, если я использую его внутри viewDidLoad()

вот главная идея, и было бы возможно использовать доработки в соответствии с этим примером,

func logInType(completion(Void1, Void2)->()) { 
if login == employer{ 
    void1 
}else if login == employee{ 
    void2 
    } 
} 

при использовании функции я хочу Ретуры n это

func logInType{(void1, void2) -> void in 
void1 = self.presentview //I want to push view to another if this code executed 
void2 = self.presentview //same idea 
} 

обновлено: код работает, но не нажимает на указанный диспетчер просмотра.

dispatch_async(dispatch_get_main_queue()){ 
         let window = UIWindow() 
         let rootViewController = window.rootViewController 
         let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
         let setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("EmployeeTBCIdentifier") 
         rootViewController?.presentViewController(setViewController, animated: true, completion: nil) 
        } 
+0

Можете ли вы добавить всю функцию, где вы пытаетесь представить свой viewController? – Karlos

ответ

1

Кажется мне, что может быть проблема в том, что вы получаете rootViewController. Я думаю, что вызов let window = UIWindow() будет возвращать новый объект UIWindow вместо того, что вы хотите, это окно, с которым связан контроллер корневого представления (и ваше приложение). Продолжая это, rootViewController будет nil, и ваш дополнительный вызов цепи rootViewController?.presentViewController(setViewController, animated: true, completion: nil) ничего не сделает. Используйте явную развертку с помощью rootViewController!.presentViewController(setViewController, animated: true, completion: nil) и вы должны увидеть ошибку

Чтобы исправить, получить правильное UIWindow другого путь, либо из UIAppDelegate или с другим контроллера вида, используя OtherViewController.view!.window!

+0

Я сделал то, что вы сказали, и он вернул «фатальную ошибку: неожиданно нашел нуль при развертывании необязательного значения» – suisied

+0

Да, поэтому вы видели ошибку, когда вы использовали 'rootViewController !.presentViewController (setViewController, animated: true, completion: noil)' ? Это было бы правильно, потому что rootViewController равен нулю. Используйте один из методов, упомянутых выше, чтобы успешно захватить правый UIWindow и извлечь из него rootViewController. –

+0

Я пользователь "var window: UIWindow?" похожее на appdelegates declaration.same error «фатальная ошибка: неожиданно найден nil при распаковке необязательного значения», и я явно разворачиваю то, что вы сказали – suisied

0

Попробуйте использовать его так:

 dispatch_async(dispatch_get_main_queue()) 
     { 
       let storyboard = UIStoryboard(name: "Main", bundle: nil) 
       let vc = storyboard.instantiateViewControllerWithIdentifier("mainView") as! MainViewController 
       self.presentViewController(vc, animated: true, completion: nil) 

     } 
+0

Согласен. Я думаю, вам даже не нужно использовать GCD. И в случае, предпочитайте использовать стиль guard-style/if_let вместо принудительного приведения с помощью as! (не критик, но более безопасный) – jlngdt

+0

Я не могу получить доступ к self.presentviewController (vc, анимированный, завершение), свойство, к которому я могу получить доступ, - это просто self.presentViewController (<# T ## UIViewController #>) – suisied

+0

исправить мой ответ – suisied