【问题标题】:loadnibnamed not loading subviewsloadnibnamed 不加载子视图
【发布时间】:2015-12-20 03:57:54
【问题描述】:

我正在尝试在用户按下按钮时使用 loadnibnamed 加载名为“AddProgramView”的 xib 文件。我在情节提要中创建了 xib,在 xib 视图中放置了各种子视图,并将插座连接到名为 AddProgramView 的相应 swift 文件。当我加载 xib 时,没有任何子视图出现。他们都不见了。帮助?这是我的代码

在我的主视图控制器中:

@IBAction func addProgram(sender: UIButton) {

    if let _ = addProgramView {
        addProgramView!.frame = CGRectMake(0, self.window!.frame.origin.y + self.window!.frame.height, self.window!.frame.width, CGFloat(325))
    }
    else {
        let addProgramViews = NSBundle.mainBundle().loadNibNamed("AddProgramView", owner: self, options: nil)
        addProgramView = addProgramViews.first as? AddProgramView

        addProgramView!.frame = CGRectMake(0, self.window!.frame.origin.y + self.window!.frame.height, self.window!.frame.width, CGFloat(325))

        window?.addSubview(addProgramView!)
    }

    window?.bringSubviewToFront(addProgramView!)

    UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
        self.addProgramView!.frame.origin.y -= CGFloat(325)
        }, completion: nil)
}

AddProgramView.swift 文件:

class AddProgramView: UIView {


    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var cancelButton: UIButton!

    @IBOutlet weak var instructionsLabel: UILabel!
}

【问题讨论】:

  • 您能否包含一些有关您声明的window 的代码?
  • 这只是应用程序委托窗口。自定义视图出现在该窗口中,但没有子视图

标签: swift xib


【解决方案1】:

首先检查,如果您在视图本身中声明了您的类名,而不是在文件所有者中。

如果没有,那就去做吧。然后再试一次。

另一种选择是在您的 AddProgramView.swift

中创建 IBOutlet
@IBOutlet var contentView: UIView!

并从视图中删除类名并将其添加到文件的所有者。

通过右键单击文件的所有者来连接 contentView:

然后像这样创建 init 方法:

class AddProgramView: UIView {
    @IBOutlet var contentView: UIView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    func commonInit() {
        NSBundle.mainBundle().loadNibNamed("AddProgramView", owner: self, options: nil)
        self.addSubview(self.contentView)
        self.contentView.frame = self.bounds
    }
}

现在您可以在任何地方使用 AddProgramView。要么通过 init(frame:)

let addProgramView = AddProgramView.init(frame: CGRectMake(0, 0, 320, 30))

或者您可以通过添加 UIView 并将它们的类设置为 AddProgramView 直接在故事板中使用它们(无需额外的代码行,故事板将为您调用 init(coder:))

我已经为你创建了示例项目 - CustomView project

【讨论】:

  • 我已经正确地尝试了第一个选项。所以我尝试了第二种选择。我应该在 commonInit() 中添加每个 IBOutlet,还是只添加包含我所有子视图的 contenView?特别是,假设我有一个名为 myTextField 的 IBOutlet,它是 contentView 中的子视图。我应该在 commonInit() 中添加 myTextField 作为 contentView 的子视图吗?我猜不是,但它不起作用。有两个问题:
  • 我已经正确地尝试了第一个选项。所以我尝试了第二种选择。我应该在 commonInit() 中添加每个 IBOutlet,还是只添加包含我所有子视图的 contenView?我猜不是,但它不起作用。有两个问题:(1) contentView 的位置从它应该在的位置向左偏移。调用 self.contentView.bounds = self.bounds 不能正常工作 (2) 只需在 commonInit() 中添加 contentView 作为子视图,子视图仍然不会出现。如果我显式添加我的子视图,它们会丢失 xib 文件中指定的所有约束。有什么想法吗?
  • 我已经为你更新了答案。您应该使用框架而不是边界。还有示例项目,看看吧。
  • 切换到框架已解决问题 (1)。您的测试项目有效。但我发誓我正在做同样的事情,但我的项目不起作用。这是我的项目的精简版。你能找出问题所在吗? dl.dropboxusercontent.com/u/35854077/TestXib.zip
  • 我发现了一个问题。您必须连接堆栈中的第一个视图。 dropbox.com/s/t0ltdlg9p5n5gzc/… 。然后您的视图将正确加载。不过,您显示视图的解决方案很糟糕。您应该创建另一个控制器并将其显示为模态。
【解决方案2】:

仔细检查您的 xib 文件中是否没有指定大小等级。它应该在编辑器窗口的底部显示 Any/Any。

【讨论】:

  • 这有什么关系?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多