向一个 UIView 多次添加 xib

Posted

技术标签:

【中文标题】向一个 UIView 多次添加 xib【英文标题】:Add a xib multiple times to one UIView 【发布时间】:2015-03-23 20:20:42 【问题描述】:

也许在一个视图控制器中多次使用同一个 xib 完全是错误的想法,但在某种程度上它看起来比使用相同标签和相同按钮创建 x 数量的视图更好。 当然还有一些关于 xibs 的乐趣:)

让您快速了解我目前取得的成就:

在属于 xib 的类中,我创建了一个委托,以便我可以在主视图控制器中捕捉按钮按下。

import UIKit

protocol TimerViewDelegate : class 
    func timerButtonTapped(buttonState : NSInteger)


class TimerView: UIView 

    var delegate : TimerViewDelegate?
    var currentButtonState = 0

    @IBOutlet var view: UIView!
    @IBOutlet var timerLabel: UILabel!
    @IBOutlet var button: UIButton!

    required init(coder aDecoder: NSCoder)
        super.init(coder: aDecoder)

        NSBundle.mainBundle().loadNibNamed("TimerView", owner: self, options: nil)
        self.addSubview(self.view)
    

    @IBAction func buttonTapped(sender:UIButton) 
        if currentButtonState == 0
            currentButtonState = 1
         else
            currentButtonState = 0
        
        self.delegate?.timerButtonTapped(currentButtonState)
    

我知道这不是超级花哨的东西,但目前我只是在评估它是否有任何用处。

在我的主视图控制器中,我以如下方式为 xib 注册了出口:

@IBOutlet weak var timerView1 : TimerView!
@IBOutlet weak var timerView2 : TimerView!
@IBOutlet ...

在 viewDidLoad() 中:

self.timerView1.delegate = self
self.timerView2.delegate = self
self...

稍后我可以通过以下方法捕捉按钮按下:

func timerButtonTapped(buttonState: NSInteger) 
    println("button press from nib, with state \(buttonState)")

从这里开始,如果我从顶部 xib 或另一个按钮按下按钮,确实会有所不同,因为它们会跟踪自己的按钮状态。 但是我怎样才能像这样区分不同的xib呢?

我可以给 xibs 本身一个标签,但我不知道这是否有任何用处。从我的主要观点来看,与他们的标签交谈也会有一个类似的问题..

即使这是使用 xibs 的完全错误的方法,我仍然对如何解决这个问题感兴趣。 感谢您的宝贵时间!

【问题讨论】:

所以问题是如何识别您从 XIB 加载的每个不同视图,因为它被多次加载并添加到多个不同的容器视图中? 【参考方案1】:

您几乎已经有了您的解决方案,您只需要改进您的协议方法规范,基本上是通过添加按钮按下时传递的TimerView

(与UITableViewDelegate 之类的委托协议相比,表格视图总是通过自身...)

所以,类似:

protocol TimerViewDelegate : class 
    func timerButtonTapped(sender: TimerView, buttonState : NSInteger)

然后代理可以找出关联的TimerView 并对其进行处理。

顺便说一句,最好将TimerView 实例存储在一个数组中,以某种方式排序,以便您可以轻松访问详细信息。

【讨论】:

感谢您的回答!我将TimerView 添加到协议中,并将buttonTapped 方法中的委托调用更改为:self.delegate?.timerButtonTapped(self, buttonState: currentButtonState) 现在在我的主视图控制器中,我可以通过标签区分xib:if sender.tag == 1 .. 在改进的timerButtonTapped方法中!但我觉得有一种更简洁的方法来分隔 xib,然后通过标签,但这是我能这么快从sender 中提取的唯一东西.. 当点击按钮时,您需要提供有关您正在做什么的更多详细信息,以获得比使用tag 更好的解决方案的更多信息。通常是在您的TimerView 中添加一个property,您可以使用您想要的信息进行设置...【参考方案2】:

您可以安全地使用标签属性。苹果文档说:

一个整数,可用于标识应用程序中的视图对象。

【讨论】:

以上是关于向一个 UIView 多次添加 xib的主要内容,如果未能解决你的问题,请参考以下文章

无法在 XIB 中添加子类

使用 xib 将 tapGestureRecognizer 添加到自定义 UIView

将 xib 中的子视图添加到自定义 UIView

如何将 UITableView 作为子视图添加到 xib 中的 UIView?

swift - 在UIScrollView上从xib添加UIView后如何更新约束?

以编程方式在 xib 上使用自动布局创建的两个文本字段之间添加 uiview