【问题标题】:XIB - UIView or UIControllerViewXIB - UIView 或 UIControllerView
【发布时间】:2017-10-11 02:20:26
【问题描述】:
我是 iOS 开发的新手。我正在尝试在我的应用程序中实现 XIB。我想将此 XIB 添加为视图的一部分,并且我希望能够获取/捕获此 XIB 的子视图(按钮、图像等)上发生的点击/点击。
起初,我将 XIB 的 File Owner 类设置为 UIView 子类,但现在我看不出有什么办法可以将来自该子类的点击/点击处理到我的 ViewController 中。
我应该(并且我可以)将 File Owner 类设置为我的 ViewController 类吗?这是允许的吗?我们应该如何处理这些在 XIB 中进行的点击/点击?
【问题讨论】:
标签:
ios
swift
xcode
uiview
xib
【解决方案1】:
为简单起见,您可以为 Xib 创建一个自定义类,就像使用带有按钮和标签、IBAction 等的插座的 viewController 一样。然后,您创建一个它遵循的协议,并将委托从您想要显示 Xib 的目标 MainView 和 ViewController 设置为该协议。在 Xib 中点击按钮时,会引用协议并调用 viewController 中的一个函数。
自定义视图:
protocol customViewDelegate: class {
func buttonClicked()
}
class CustomView: UIView {
weak var delegate: customViewDelegate?
@IBAction func buttonPressed(_ sender: Any) {
delegate?.buttonClicked()
}
}
还有 ViewController:
class viewController: UIViewController, customViewDelegate {
@IBOutlet weak var viewContainer: CustomView!
var customView: CustomView?
override func viewDidLoad() {
customView = CustomView.loadFromNib()
customView.delegate = self
}
func buttonClicked() {
//Do what you wanted to do when the button inside the Xib was clicked.
}
}
【解决方案2】:
文件的所有者是加载 nib 时将被识别的实际对象的代理或替身。 [编辑。我应该注意“nib”是接口文件的旧术语。 xib 是新奇的名称。实际上,在构建项目时,xib 文件会编译为 nib 文件。如果我有点老派,请原谅我可以互换使用 nib/xib] 您可以选择使用您的视图控制器作为界面文件中的“文件所有者”。使用它可能看起来像这样:
class MyViewController : UIViewController {
@IBOutlet loadedView : UIView!
func loadMyInterface() {
// load the nib with myself as the "Files Owner". If the nib file is set up properly
// shoudl set the "loadedView" outlet on this object
Bundle.mainBundle.loadNibNamed("MyLoadedView", owner: self, options: nil)
}
}
在这段代码 sn-p 中,我有 loadedView 插座。创建我的视图控制器时,这将是nil。然后在我的程序执行的某个时刻,我调用loadMyInterface。该例程将要求主包加载接口文件“MyLoadedView”。请注意,此时我告诉系统“文件所有者”代表什么对象。因为我已将我的视图控制器标识为owner,所以接口文件中为文件所有者标识的任何出口都将连接到该视图控制器。
此外,您可以在视图控制器类上定义 Actions 并将它们连接到接口构建器中的“文件所有者”,当加载 lib 时,它们将被定向到视图控制器。
请注意,这仅仅是因为我在加载 nib 时将我的视图控制器标识为 owner。我可以轻松地将任何其他对象设置为文件的所有者,并指示所有者的出口和操作应该去那里。
【解决方案3】:
不,您不应该将 FileOwner 设置为 ViewController。您应该向 ViewController 添加一个手势识别器,并将该手势识别器添加到视图中。
我不知道在 Swift 中,但在目标 c 中你会做这样的事情:
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarger:customView action:@selector(mySelector)];