2016-10-24 4 views
1

В настоящее время я занимаюсь разработкой приложений с использованием IOS 10 и Swift 3IOS 10 Swift 3 UIViewController присутствует не работает

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

Действительно, когда я пытаюсь представить новый контроллер представления, у меня есть это предупреждение в отладчике Xcode.

Предупреждение: попытка представить FirstViewController на Project.StoryBoardManager, чей вид не находится в иерархии окон!

Я провел некоторое исследование, но я не могу исправить свою ошибку.

У меня есть это на моем AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    let storyboard = UIStoryboard(name:"Authentication", bundle: nil) 
    let vc = storyboard.instantiateInitialViewController() as UIViewController! 

    self.window?.rootViewController = vc 
    self.window?.makeKeyAndVisible() 

    return true 
} 

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

class StoryBoardManager: UIViewController{ 

fileprivate var appD = UIApplication.shared.delegate as! AppDelegate 

func changeView(storyboardName: String){ 

    let storyboard = UIStoryboard(name: storyboardName, bundle: nil) 
    if let vc = storyboard.instantiateInitialViewController() { 

     vc.modalTransitionStyle = UIModalTransitionStyle.flipHorizontal 
     vc.modalPresentationStyle = UIModalPresentationStyle.fullScreen 

     //appD.window?.rootViewController = vc 
     present(vc, animated: true, completion: nil) 

    } else { 
     print("Unable to instantiate VC from \(storyboardName) storyboard") 
    } 
    } 
override func viewDidLoad(){ 
    super.viewDidLoad() 
} 

Если я комментирую обновление RootViewController новый контроллер не представлен ,

EDIT для @Zac Kwan

import Foundation 
import UIKit 

class CustomNavBar: UIView { 

    fileprivate let _storyBoardManager : StoryBoardManager = StoryBoardManager() 
fileprivate var _currentUIViewController : UIViewController = UIViewController() 

init() { 
    super.init(frame: CGRect(x: 0, y: 0, width:0, height:0)) 
} 

func changeViewStoryboard(sender: UIButton!){ 

    if (sender.tag == 0){ 
     self._storyBoardManager.changeView(storyboardName: "View1") 
    } else if (sender.tag == 1) { 
     self._storyBoardManager.changeView(storyboardName: "View2") 
    } else if (sender.tag == 2) { 
     self._storyBoardManager.changeView(storyboardName: "View3") 
    } else { 
     self._storyBoardManager.changeView(storyboardName: "View4") 
    } 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 
} 

func createButton(title: String, posX: Double, witdh: Double, tag: Int, font: UIFont) -> UIButton { 

    let buttonCreated = UIButton(frame: CGRect(x: posX, y: 0, width: witdh, height: 60)) 
    buttonCreated.setTitle(title, for: UIControlState()) 
    buttonCreated.setTitleColor(CommonVariable.darkGrey, for: UIControlState()) 
    buttonCreated.titleLabel!.font = font 
    buttonCreated.tag = tag 
    buttonCreated.addTarget(self, action:#selector(self.changeViewStoryboard(sender:)), for: UIControlEvents.touchUpInside) 

    buttonCreated.backgroundColor = UIColor.white 

    return buttonCreated 

} 

required init?(coder aDecoder: NSCoder) { 
    Super. Inuit (coder: decoder) 

    addSubview(self.createButton(title: « ChangeView », posX: 256.0, witdh: Double(self._sizeButton) - 1, tag: 1, font: UIFont(name: « Arial », size: 15)!)) 
    addSubview(self.createButton(title: « ChangeView 2 », posX: 512.0, witdh: Double(self._sizeButton) - 1, tag: 2, font: UIFont(name: « Arial », size: 15)!)) 
} 

} 
+0

Предупреждение рассказал, почему он не может присутствовать. В принципе, ваш класс 'StoryBoardManager' в настоящее время не является' ViewController' в иерархии окон, поэтому он не может представить новый vc. Можете ли вы показать больше кода о том, как называется 'changeView'? –

+0

@ZacKwan У меня есть обновление моего сообщения. Спасибо за помощь –

ответ

-1

Пожалуйста, попробуйте изменить код, как показано ниже:

class StoryBoardManager: UIViewController{ 

fileprivate var appD = UIApplication.shared.delegate as! AppDelegate 

func changeView(storyboardName: String){ 

    let storyboard = UIStoryboard(name: storyboardName, bundle: nil) 
    if let vc = storyboard.instantiateInitialViewController() { 

     vc.modalTransitionStyle = UIModalTransitionStyle.flipHorizontal 
     vc.modalPresentationStyle = UIModalPresentationStyle.fullScreen 

     //appD.window?.rootViewController = vc 
     appD.present(vc, animated: true, completion: nil) 

    } else { 
     print("Unable to instantiate VC from \(storyboardName) storyboard") 
    } 
    } 
override func viewDidLoad(){ 
    super.viewDidLoad() 
} 
Смежные вопросы