Как протолкнуть и представить UIViewController программно без перехода в iOS Swift 3

#ios #swift #xcode #swift3 #uiviewcontroller

#iOS #swift #xcode #swift3 #uiviewcontroller

Вопрос:

Я использую этот код для push-ПОКАЗА и МОДАЛЬНО программно в iOS Objective C.
А теперь хотите узнать о 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];  
  

Ответ №1:

Толкать

сделайте как

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

или безопаснее

   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)
        }
    }
  

присутствует

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

или безопаснее

    if let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "NewsDetailsVCID") as? NewsDetailsViewController
     {

     vc.newsObj = newsObj
    present(vc, animated: true, completion: nil)
    }
  

Комментарии:

1. можете ли вы объяснить or safer часть здесь сравнительно, 1 за это.

2. @vaibhav «или безопаснее» относится к обработке потенциального необязательного случая «nil» при создании экземпляра контроллера представления. «if let» — это классический способ обработки необязательного nil в swift.

3. что, если у меня нет никакого контроллера просмотра в раскадровке, но все, что я делаю программно, тогда что мне делать, чтобы вызвать или объявить идентификатор контроллера просмотра

4. @iOSDeveloper- если это возможно, вы можете напрямую вызвать VC

5. Зачем вам нужно его безопасно разворачивать? Оба они приводят к тому, что происходит одно и то же — если присутствует NavigationController, он запускает контроллер представления, в противном случае ничего не происходит.

Ответ №2:

Элегантным способом.

Создайте навигационный протокол:

 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
}
  

Создайте реализацию контроллера экземпляра по умолчанию:

 /**
 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
    }
}
  

Расширяет UIViewController для отправки контроллера представления:

 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 }
    }
}
  

Затем вы можете использовать Navigatable протокол для определенного контроллера представления.

 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)
  

Ответ №3:

 //Create object of view controller 
let obj = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerIdentifier”) as! ViewControllerName

//Push Controller
self.navigationController?.pushViewController(obj, animated: true)

//Present Controller
self.navigationController?.present(obj, animated: true, completion: nil)