从Storyboard实例化View Controller与创建新实例

2020/12/16 23:31 · ios ·  · 0评论

从情节提要实例化View Controller和为其创建新实例之间有什么功能区别?例如:

#import "SomeViewController.h"

...

SomeViewController *someViewController = [SomeViewController new];

#import "SomeViewController.h"

...

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

SomeViewController *someViewController = [storyboard instantiateViewControllerWithIdentifier:@"SomeViewController"];

无论哪种情况,someViewController实际上是同一件事吗?

主要区别在于UIViewController实例化子视图的方式

在第二种情况下,将自动为您实例化在情节提要中创建的所有视图,并且将按照您在情节提要中指定的方式设置所有出口和动作。

在第一种情况下,这些都不会发生。您只是得到原始对象。您将需要分配和实例化所有子视图,使用约束或其他方式对它们进行布局,并自行连接所有出口和操作。苹果建议通过覆盖的loadView方法来做到这一点UIViewController

在第二种情况下,视图控制器将从情节提要中加载其视图,您会很高兴。

在第一种情况下,不会。除非您采取了其他步骤(例如,覆盖loadViewviewDidLoad创建名为的xib SomeViewController.xib),否则您只会得到空白的视图,并且感到难过。

在Swift中,您可以执行以下操作:

var someVC = self.storyboard?.instantiateViewControllerWithIdentifier("SomeViewController") as! SomeViewController

您将需要将情节提要中标识符提供给SomeViewController并选中复选标记以使用情节提要ID

这不是一回事。在情节提要中,您可能已布置了一些UI元素。他们可能通过情节提要具有约束和属性设置。当通过情节提要实例化视图控制器时,您将获得有关这些子视图的位置及其属性的所有说明。如果只是说[SomeViewController new]您没有得到情节提要对视图控制器的所有说明。

一个不错的测试是将UIViewController添加到情节提要并将红色视图拖到其上。使用这两种方法实例化它,看看有什么区别。

simple swift 3 extension   
 fileprivate enum Storyboard : String {
        case main = "Main"
    }

    fileprivate extension UIStoryboard {
        static func loadFromMain(_ identifier: String) -> UIViewController {
            return load(from: .main, identifier: identifier)
        }

        static func load(from storyboard: Storyboard, identifier: String) -> UIViewController {
            let uiStoryboard = UIStoryboard(name: storyboard.rawValue, bundle: nil)
            return uiStoryboard.instantiateViewController(withIdentifier: identifier)
        }
    }

    // MARK: App View Controllers

    extension UIStoryboard {
        class func loadHomeViewController() ->  HomeViewController {
            return loadFromMain("HomeViewController") as! HomeViewController
        }
    }

如果您不想使用实例化新的VC,instantiateViewControllerWithIdentifier而是要从AppDelegate访问情节提要创建的实例,请执行以下操作:

  1. 在AppDelegate.h中创建一个属性,以便使用它的类可以访问它
    @property (nonatomic, strong) myViewControllerClass*vC;
  2. viewDidLoadmyViewControllerClass.m内部,我访问AppDelegate的共享实例并使用self馈送该属性:[AppDelegate sharedInstance].vC = self;

我不得不在复杂的情节提要中使用此解决方案,但仍然无法克服这样一个事实,即我无法找到一种简单的方法来简单地通过解决它们的标识符来访问情节提要中的所有(或至少我需要的那些)对象。

要检查的另一件事是,引发错误的视图控制器是否具有storyboardIdentifier,则可以检查Storyboard Xib文件。

在我的情况下,缺少标识符,当我添加它时错误停止了

本文地址:http://ios.askforanswer.com/congstoryboardshilihuaview-controlleryuchuangjianxinshili.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!