Можно ли представить ViewController, у которого нет storyBoard, но его родительский viewcontroller имеет раскадровку (повторно использовать родительский файл раскадровки VC) - PullRequest
0 голосов
/ 26 апреля 2018

Представление ViewController с помощью storyBoard: если newViewController находится в StoryBoard. мы можем представить его, используя следующий метод.

 let storyboard = UIStoryboard(name: "AViewController"), bundle: UIBundle.main)
let newViewcontroller = storyboard.instantiateInitialViewController() as? AViewController
  self.present(newViewcontroller, animated: false, completion: nil)

Возможно ли представить ViewController, которого нет в storyBoard, но его родительский viewcontroller имеет раскадровку

Я создал программный контроллер вида B программно (без StoryBoard), теперь я хотел бы представить BViewController, и он должен использовать AViewController StoryBoard?

class AViewController : UIViewController
{
//this class is in storyboard which is generic design that I want to use it in different ways.
}
class BViewController : AViewController
{
....//
}
e.g.
 self.present(BViewController(), animated: false, completion: nil)?

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

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Все возможно программно. Не все возможно через Interface Builder. Раскадровки - это всего лишь компонент Interface Builder.

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

@objc private func presentViewController() {

    guard let root = UIApplication.shared.keyWindow!.rootViewController else {
        return
    }

    let destination = SomeViewController()
    destination.transitioningDelegate = YourAnimationVendor()
    destination.modalPresentationStyle = .custom
    root.present(destination, animated: true, completion: nil)

}

Вы можете пропустить переходящего делегата (и поставщика пользовательских анимаций) и представить его с использованием стандартной анимации UIKit, например .fullScreen вместо .custom.

@objc private func presentViewController() {

    guard let root = UIApplication.shared.keyWindow!.rootViewController else {
        return
    }

    let destination = SomeViewController()
    destination.modalPresentationStyle = .fullScreen
    root.present(destination, animated: true, completion: nil)

}
0 голосов
/ 12 мая 2019

Я нашел ответ, чтобы повторно использовать файл раскадровки или унаследовать файл раскадровки.

object_setClass (Устанавливает класс объекта.) Переопределит экземпляр AViewController с помощью класса BViewController. Итак, поверх AViewController вы можете добавить еще несколько методов.

когда у вас есть аналогичный viewcontroller с небольшими изменениями. Вы должны создавать разные viewcontrollers. используя этот метод, вы можете создать базовый viewcontroller с раскадровкой и повторно использовать этот viewcontroller.

 class BViewController{
       static func vcInstanceFromStoryboard() ->BViewController? {
            let storyboard = UIStoryboard(name: "AViewController"), bundle: UIBundle.main)
            let instance = storyboard.instantiateInitialViewController() as? AViewController
            object_setClass(instance, BViewController.self) // 
            return (instance as? BViewController)!
        }
    .....
    } 

This is an example of how do we use it:
let vc = BViewController.vcInstanceFromStoryboard()
self.present(vc , animation : true)
0 голосов
/ 26 апреля 2018

Ваш код будет работать нормально, если ваш ViewController действительно не находится в раскадровке. Все, что вам нужно сделать, это создать его экземпляр без nibName, например:

class ViewController: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }
}

Обычная раскадровка ViewControllers полагаются на инициализацию coder, но вы можете создавать их обычно с помощью инициализатора nibName: nil, если у вас нет выходов (это ваш случай, так как ViewController не на раскадровке)

...