present open change ios swift xcode swift3 uiviewcontroller

ios - open - swift present view controller programmatically



Cómo empujar y presentar a UIViewController mediante programación sin segue en iOS Swift 3 (2)

Estoy usando este código para push SHOW y MODALMENTE programáticamente en iOS Objective C.
Y ahora quiero saber sobre Swift 3.

NewsDetailsViewController *vc = instantiateViewControllerWithIdentifier:@"NewsDetailsVCID"]; vc.newsObj = newsObj; //--this(SHOW) [self.navigationController pushViewController:vc animated:YES]; //-- or this(MODAL) [self presentViewController:vc animated:YES completion:nil];

Gracias.


Con una forma elegante.

Crear un protocolo navegable:

protocol Navigatable { /// Storyboard name where this view controller exists. static var storyboardName: String { get } /// Storyboard Id of this view controller. static var storyboardId: String { get } /// Returns a new instance created from Storyboard identifiers. static func instantiateFromStoryboard() -> Self }

Cree una implementación de controlador de instancia predeterminada:

/** Extension of Navigatable protocol with default implementations. */ extension Navigatable { static func instantiateFromStoryboard() -> Self { let storyboard = UIStoryboard(name: self.storyboardName, bundle: nil) guard let viewController = storyboard .instantiateViewController(withIdentifier: self.storyboardId) as? Self else { fatalError("Cannot instantiate the controller.") } return viewController } }

Extiende el UIViewController para impulsar un controlador de vista:

extension UIViewController { /** Pushes a view controller of the provided type. - Parameter viewControllerType: Type of view controller to push. - Parameter completion: Function to be executed on completion. Contains the view controller that was pushed when successful and nil otherwise. */ func pushViewControllerOfType<T: Navigatable>(viewControllerType: T.Type, completion: (T) -> Void) { let viewController = T.instantiateFromStoryboard() if let vc = viewController as? UIViewController { self.pushViewController(vc, animated: true) } completion(viewController) } /** Pushes a view controller of the provided type. - Parameter viewControllerType: Type of view controller to push. */ func pushViewControllerOfType<T: Navigatable>(viewControllerType: T.Type) { self.pushViewControllerOfType(viewControllerType: viewControllerType) { _ in } } }

Luego puede usar el protocolo Navigatable para un controlador de vista específico.

class MySuperViewController { override func viewDidLoad() { ... } // ... } extension MySuperViewController: Navigatable { static var storyboardName: String { return "Main" } static var storyboardId: String { return "MySuperViewControllerId" // From your story board name Main } } // Instantiate your controller let vc = MySuperViewController.instantiateFromStoryboard() // Or // // Push your view controller // testViewController.swift self.pushViewControllerOfType(viewControllerType: MySuperViewController)


empujar

Gustar

let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("NewsDetailsVCID") as NewsDetailsViewController vc.newsObj = newsObj navigationController?.pushViewController(vc, animated: true)

o más seguro

if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "NewsDetailsVCID") as? NewsDetailsViewController { viewController.newsObj = newsObj if let navigator = navigationController { navigator.pushViewController(viewController, animated: true) } }

presente

let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = self.storyboard?.instantiateViewControllerWithIdentifier("NewsDetailsVCID") as! NewsDetailsViewController vc.newsObj = newsObj present(vc!, animated: true, completion: nil)

o más seguro

if let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "NewsDetailsVCID") as? NewsDetailsViewController { vc.newsObj = newsObj present(vc, animated: true, completion: nil) }