将xib多次添加到一个UIView中

时间:2015-03-23 20:20:43

标签: ios swift xib nib

在一个viewcontroller中多次使用相同的xib可能是完全错误的想法,但它看起来比用相同的标签和相同的按钮创建x量的视图要好一些。 当然,与xibs有一些乐趣:)

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

enter image description here

在属于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自己一个标签,但我不知道这是否有用。在我的主视图中与他们的标签交谈,也会有类似的问题..

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

2 个答案:

答案 0 :(得分:1)

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

(与UITableViewDelegate之类的委托协议相比较,表格视图总是自行传递......)

所以,比如:

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

然后代理人可以找出与TimerView相关联的内容并对其执行某些操作。

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

答案 1 :(得分:0)

您可以安全地使用tag属性。 Apple文档说:

  

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