i have a view that is a xib, this view contains a buttons for a calculator, I did this because I need a custom keyboard for my app, my app has some views that needs this keyboard the problem is, how I send the data from view to my view controller? in my view controller I only has a textfield and a view with xib custom class
I use swift 4.2
this is my code from my xib
import UIKit
class keyboardView: UIView {
@IBOutlet var viewKeyboard: UIView!
var textIntroduced = ""
override init(frame: CGRect) { // for using CustomView in code
super.init(frame: frame)
custom()
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
custom()
}
private func custom()
{
Bundle.main.loadNibNamed("keyboard", owner: self, options: nil)
viewKeyboard.frame = self.bounds
viewKeyboard.autoresizingMask = [.flexibleHeight,.flexibleWidth]
for view in viewKeyboard.subviews
{
view.isExclusiveTouch = true
}
addSubview(viewKeyboard)
}
@IBAction func addOne(_ sender: Any) {
textIntroduced += "1"
}
@IBAction func addTwo(_ sender: Any) {
textIntroduced += "2"
}
@IBAction func addThree(_ sender: Any) {
textIntroduced += "3"
}
@IBAction func addFour(_ sender: Any) {
textIntroduced += "4"
}
@IBAction func addFive(_ sender: Any) {
textIntroduced += "5"
}
@IBAction func addSix(_ sender: Any) {
textIntroduced += "6"
}
@IBAction func addSeven(_ sender: Any) {
textIntroduced += "7"
}
@IBAction func addEight(_ sender: Any) {
textIntroduced += "8"
}
@IBAction func addNine(_ sender: Any) {
textIntroduced += "9"
}
@IBAction func addZero(_ sender: Any) {
textIntroduced += "0"
print(textIntroduced)
}
@IBAction func removeNumber(_ sender: Any) {
textIntroduced.removeLast()
}
}
in my view controller I only has a textfield and view with custom class
i want to push any button view and the result should be written in the textfield.
You can use protocol to observe data changes in your xib. First of all you need to create a protocol like this.
protocol NumberCalculable: class {
func addNumber(_ number: Int)
}
Then, inside your xib file below your viewKeyboard
outlet you need to create a delegate for your protocol.
weak var delegate: NumberCalculable?
Instead of doing textIntroduced += 1
you should change with this delegate?.addNumber(1)
and same for other IBAction
methods.
Thirdly, you need to conform your protocol in your viewController
class doing
keyboardView.delegate = self
inside viewDidLoad()
method.
extension ViewController: NumberCalculable {
func addNumber(_ number: Int) {
// do whatever you want
}
}
Hope this helps.