【问题标题】:Opening a UIView from another UIView从另一个 UIView 打开一个 UIView
【发布时间】:2017-12-14 21:22:58
【问题描述】:

我有一个 UIViewController,它带有一个打开模态/弹出窗口 (XIB) 的按钮

我为此使用此代码:

let aView: myView1 = UINib(nibname: "AView", bundle : nil).instantitate(withOwner: self, options: nil)[0] as! myView1
aView.frame = self.view.frame
self.view.addSubView(aView)

Modal 包含一个应该打开表单(另一个 XIB)的按钮

我为此使用此代码:

let bView: myView2 = UINib(nibname: "BView", bundle : nil).instantitate(withOwner: self, options: nil)[0] as! myView2
bView.frame = self.view.frame
self.view.addSubView(bView)

但我得到一个编译时错误,说:

“AView”类型的值没有成员“view”

当我更改代码时:

self.view.addSubview(bView)

到:

self.addSubview(bView)

在 UIView 中使用上述行时出现运行时错误:

这个类不符合键视图的键值编码。

如果我将上面的行重新定位到 UIViewController,我会得到一个不同的错误:

无法将自身添加为子视图

是否有其他方法可以从另一个 UIView 打开一个 UIView,而无需返回或更改 UIViewController?

【问题讨论】:

  • 您是否有任何理由在UIViews 上执行此操作,而不是使用完整的UIViewControllers 作为您的模态并使用present(viewController:animated:completion:) 方法显示它们?
  • 我使用 XIB 编写了 UIView,这是唯一的原因。现在我使用 Storyboard 和 UIViewController 重写了整个事情,我没有遇到前面指定的问题。顺便说一句,编码兼容问题是由于出口参考损坏。
  • 你也可以在 xibs 中拥有视图控制器。

标签: ios uiview swift3 uiviewcontroller modal-dialog


【解决方案1】:

首先我建议将类名从myView1 更改为MyView1,与myView2 相同。然后将您的 nib 文件 file's owner 从界面生成器设置为 MyView1MyView1

在下面的调用中将此withOwner: self 更改为nil

let aView:myView1 = UINib(nibname: "AView", bundle : nil).instantitate(withOwner: self, options: nil)[0] as! myView1

您可能需要从界面生成器中删除 file's owner

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2011-10-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多