ios - 无法以编程方式将 View 添加到 Storyboard 中的现有 uiview

标签 ios swift uiview uiscrollview swift2

我正在尝试在代码中模拟此 View 层次结构:

 "scene"
    "view Shop Main"                       -> `UIView`
        "view shop scroll"                 -> `UIScrollView`
            "ViewDetail"                   -> `UIView`
                "Shop Connected Container" -> `UIView`
                    "Connected Shop"       -> `UIView`

我想实例化多个“Connected Shop”并将它们添加到“Shop Connected Container” 像这样:

"scene"
    "view Shop Main"                       -> `UIView`
        "view shop scroll"                 -> `UIScrollView`
            "ViewDetail"                   -> `UIView`
                "Shop Connected Container" -> `UIView`
                    "Connected Shop"       -> `UIView`
                    "Connected Shop"       -> `UIView`
                    "Connected Shop"       -> `UIView`

我怎样才能以编程方式做到这一点? 我为每个 subview 都有一个自定义类,还有一个 xib 文件。 这就是我从代码中实例化 subview 的方式:

  override func viewDidLoad() {

  /*1*/         let vShopMain = NSBundle.mainBundle().loadNibNamed("viewShopMain", owner: self, options: nil).first as! viewShopMain
    /*2*/       let vShopScroll = NSBundle.mainBundle().loadNibNamed("viewShopScroll", owner: vShopMain, options: nil).first as! viewShopScroll

    /*3*/       let vDetail : UIView = NSBundle.mainBundle().loadNibNamed("viewDetail", owner: vShopScroll, options: nil).first as! viewDetail
//
//
    /*4*/       let sConContainer : UIView = NSBundle.mainBundle().loadNibNamed("shopConnectedContainer", owner: vDetail, options: nil).first as! shopConnectedContainer
   /*5*/        let cShop = NSBundle.mainBundle().loadNibNamed("connectedShop", owner: sConContainer, options: nil).first as! connectedShop


        cShop.bannerTitle.text = "Shop Title"

        vShopMain.addSubview(vShopScroll)
        vShopScroll.addSubview(vDetail)
        vDetail.addSubview(sConContainer)
        sConContainer.addSubview(cShop)


        self.view.addSubview(sConContainer)

也尝试过,结果完全相同:

        let vShopMain = UINib(nibName: "viewShopMain", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! viewShopMain

       let scroll = UINib(nibName: "viewShopScroll", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! viewShopScroll

        let vDetail = UINib(nibName: "viewDetail", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! viewDetail

        let sConContainer = UINib(nibName: "shopConnectedContainer", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! shopConnectedContainer

        let cShop = UINib(nibName: "connectedShop", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! connectedShop

        cShop.bannerTitle.text = "hola"

        vShopMain.addSubview(scroll)
        scroll.addSubview(vDetail)
        vDetail.addSubview(sConContainer)
        sConContainer.addSubview(cShop)


        self.view.addSubview(sConContainer)

但是添加的"new" View 位于其他 View 下方,这不是预期的行为,因为我正在实例化 Storyboard中的现有 View ,而不是创建新 View 。

我遵循 Storyboard层次结构的顺序。此外, View 与它们的自定义类链接,并且它们有它们的 xib 文件。但是当我运行我的应用程序时,我遇到了这个奇怪的问题

我在这里做错了什么?请帮忙

最佳答案

帮助您找出崩溃的原因。 loadNibNamed 返回对象数组而不是单个 View 。所以这肯定会崩溃

let vShopScroll = NSBundle.mainBundle().loadNibNamed("viewShopScroll", owner: self, options: nil) as! viewShopScroll  

因为您假设它返回 viewShopScroll 并强制展开它。正如您所说,您的第一行正在工作,因为您获取了 first 对象

let vShopMain = NSBundle.mainBundle().loadNibNamed("viewShopMain", owner: self, options: nil).first as! viewShopMain

对所有其他情况也执行相同的操作

关于ios - 无法以编程方式将 View 添加到 Storyboard 中的现有 uiview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38455463/

相关文章:

swift - React Native - IOS推送通知 - 如何在应用程序处于后台时播放铃声?

ios - 检查 subview 是否在 View 中

iphone - 不规则形状的UIBezierPath填充

ios - 如何通过 UITabBarController 将 indexPathForSelectedRow 传递到 UITabView?

ios - 从 Firebase 数据库异步方法返回值

ios - UIView transitionWithView 快速语法

ios - 如何在 SpriteKit 中使用 UITextView?

iOS Swift - 自定义 UITableViewCell

swift - ios8 手势识别器不能在 WKWebView 上快速工作

ios - 禁用编辑但允许继续快速输入