多次向一个 UIView 添加一个 xib
Add a xib multiple times to one UIView
也许在一个 viewcontroller 中多次使用相同的 xib 完全是错误的想法,但它在某种程度上看起来比创建具有相同标签和相同按钮的 x 数量的视图更好。 .
当然还有 xibs 的一些乐趣:)[=15=]
为了让您快速了解我到目前为止所取得的成就:
在属于 xib 的 class 中,我创建了一个委托,这样我就可以在我的主视图控制器中捕捉到按钮按下。
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)
}
}
我知道这不是超级花哨的东西,但目前我只是在评估它是否有任何用处。
在我的主视图控制器中,我以如下方式为 xibs 注册了插座:
@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 或另一个按钮按下按钮,确实会有所不同,因为它们会跟踪自己的按钮状态。
但是我怎样才能像这样区分不同的xibs呢?
我可以给xibs自己打个标签,但不知道有没有用。同样从我的主要观点与他们的标签交谈,也会有一个类似的问题..
即使这是使用 xibs 的完全错误的方法,我仍然对如何解决这个问题感兴趣。
感谢您的宝贵时间!
您可以安全地使用标签 属性。苹果文档说:
An integer that you can use to identify view objects in your application.
你几乎已经有了你的解决方案,你只需要改进你的协议方法规范,基本上是通过添加传递按钮按下的 TimerView
。
(与 UITableViewDelegate
这样的委托协议比较,其中 table 视图总是传递自身...)
所以,类似于:
protocol TimerViewDelegate : class {
func timerButtonTapped(sender: TimerView, buttonState : NSInteger)
}
然后代表可以找出关联的 TimerView
并对其进行处理。
顺便说一下,最好将 TimerView
个实例存储在一个数组中,以某种方式排序,以便您可以轻松访问详细信息。
也许在一个 viewcontroller 中多次使用相同的 xib 完全是错误的想法,但它在某种程度上看起来比创建具有相同标签和相同按钮的 x 数量的视图更好。 . 当然还有 xibs 的一些乐趣:)[=15=]
为了让您快速了解我到目前为止所取得的成就:
在属于 xib 的 class 中,我创建了一个委托,这样我就可以在我的主视图控制器中捕捉到按钮按下。
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)
}
}
我知道这不是超级花哨的东西,但目前我只是在评估它是否有任何用处。
在我的主视图控制器中,我以如下方式为 xibs 注册了插座:
@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 或另一个按钮按下按钮,确实会有所不同,因为它们会跟踪自己的按钮状态。 但是我怎样才能像这样区分不同的xibs呢?
我可以给xibs自己打个标签,但不知道有没有用。同样从我的主要观点与他们的标签交谈,也会有一个类似的问题..
即使这是使用 xibs 的完全错误的方法,我仍然对如何解决这个问题感兴趣。 感谢您的宝贵时间!
您可以安全地使用标签 属性。苹果文档说:
An integer that you can use to identify view objects in your application.
你几乎已经有了你的解决方案,你只需要改进你的协议方法规范,基本上是通过添加传递按钮按下的 TimerView
。
(与 UITableViewDelegate
这样的委托协议比较,其中 table 视图总是传递自身...)
所以,类似于:
protocol TimerViewDelegate : class {
func timerButtonTapped(sender: TimerView, buttonState : NSInteger)
}
然后代表可以找出关联的 TimerView
并对其进行处理。
顺便说一下,最好将 TimerView
个实例存储在一个数组中,以某种方式排序,以便您可以轻松访问详细信息。