2016-05-16 3 views
1

Итак, у меня есть segue от ViewController до SecondViewController. Этот сеанс запускается UIButton в ViewController, а модально представляет SecondViewController. Идентификатор Segue установлен («SegueIdentifier»), и я могу запросить segue программно из моего ViewController.Не удается вызвать Segue по идентификатору из AppDelegate

Когда я пытаюсь сделать то же самое в своем AppDelegate, я получаю сообщение об ошибке, что компилятор не может найти segue с установленным мной идентификатором.

let viewController = ViewController()    
viewController.performSegueWithIdentifier("SegueIdentifier", sender: nil) 

Опять же, я буквально скопировать и вставить вызов метода performSegueWithIdentifier из вышеупомянутого метода в ViewController, в котором я также называю performSegueWithIdentifier для того же Segue, и она работает.

Любые идеи?

+0

это ваш первоначальный вид, что вы пытаетесь От себя? –

+0

@GurPreet_Singh Нет, представление, которое я пытаюсь нажать, не является начальным. – Jonas

+0

Поскольку вы создаете экземпляр ViewController с помощью простого инициализатора, он не связан с раскадрой.Вы должны получить доступ к контроллеру корневого представления из своего основного окна на экземпляре UIApplication обломочного устройства – Paulw11

ответ

1

В моем одном проекте я управляю этой ситуацией, как,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
// Override point for customization after application launch. 

NSString *identifier; 
BOOL isSaved = [[NSUserDefaults standardUserDefaults] boolForKey:@"loginSaved"]; 
if (isSaved) 
{ 
    [email protected]"home1"; 



} 
else 
{ 
    [email protected]"dis1"; 
} 
UIStoryboard * storyboardobj=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
UIViewController *screen = [storyboardobj instantiateViewControllerWithIdentifier:identifier]; 



[self.window setRootViewController:screen]; 


return YES; 
} 

Он находится в Objective C и только для справки. Если это может помочь вам :)

Update:

В быстром что-то вроде,

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 



    var identifier: String = String() 

    let isSaved = NSUserDefaults.standardUserDefaults().boolForKey("loginsaved") 


    if isSaved 

    { 
     identifier = "home1" 
    } 
    else{ 

     identifier = "dis1" 
    } 

    let storyboardobj: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let screen: UIViewController = storyboardobj.instantiateViewControllerWithIdentifier(identifier) 
    self.window!.rootViewController = screen 

    // Override point for customization after application launch. 
    return true 
} 

Надеется, что это поможет :)

1

Если вы не пытаетесь показать свой первоначальный вид, то сделать так:

UIApplication.sharedApplication().keyWindow?.rootViewController.performSegueWithIdentifier("SegueIdentifier", sender: nil) 

А также это зависит, что вы непосредственно перейти установлен в вашем RootViewController. Проверьте это, прежде чем вы это сделаете.

+0

Будет ли это работать, если у меня нет rootViewController? – Jonas

+0

Каждое приложение должно иметь контроллер корневого представления. ваше приложение не будет работать без корневого представления. –

+0

Хорошо спасибо! Я попробую это позже. – Jonas

1

У Segue-соединения есть информация с ним, как Source Controller, Destination Controller. Поэтому, пока вы вызываете метод performSegue из класса ViewController, он будет работать, потому что у этого класса есть информация об этом соединении Segue. Пока вы вызываете тот же метод Segue из App Delegate, он не будет работать. Поскольку класс App Delegate не имеет информации или определения об этом объекте Segue.

Вы также должны проверить, находится ли вызывающий объект под навигационным контроллером или нет.

0

Сценарий раскадровки должен быть привязан к определенному viewController, с которого вы пытаетесь переходить. Таким образом, вы должны иметь экземпляр текущего контроллера представления на экране. Вы можете использовать метод в UIApplication.sharedApplication().keyWindow?.rootViewController

, чтобы получить доступ к RootViewController в окне, однако, если вы представили контроллер представления над RootViewController, и вы хотите, чтобы выполнить переход на представленном контроллере представления, вы должны получить доступ к rootViewController.presentedViewController. И так как вы можете иметь несколько presentedViewControllers, что вы делаете это:

//get the root view controller 
var currentViewController = UIApplication.sharedApplication().keyWindow?.rootViewController 
//loop over the presented view controllers and until you get the top view controller 
while currentViewController.presentedViewController != nil{ 
    currentViewController = currentViewController.presentedViewController 
} 
//And finally 
currentViewController.performSegueWithIdentifier("identifier", sender: nil) 
Смежные вопросы