如何使用 swift 中的委托通知 UIViewController 在 xib 文件中单击了按钮?
how to notify a UIViewController that a button was clicked in a xib file using a delegate in swift?
我有点卡住了。
我有一个 UIViewController
和一个扩展 UIView
的自定义 pop.xib
。
pop.xib
连接到 pop.swift
。
在 UIViewController
中,一个按钮使 .xib
文件弹出。
并且在 pop.xib
中有一个按钮,单击该按钮可将一些数据发送到数据库。
但是当在 pop.xib
中单击该按钮发送数据时,我希望 UIViewController
到
a) 知道何时单击 @IBAction func sendDataToDbAction(_ sender: Any)
和
b) 当 sendDataToDbAction
内部的 if 语句 returns 为假时,则在 UIViewController
上显示警报
//pop.swift
class Pop: UIView {
@IBOutlet var delegate: AnswerDelegate?
@IBAction func sendDataToDbAction(_ sender: Any)
{
if(answer == false)
{
don't send to db
alert pops up saying answer is false
}
else
{
}
}
}
我已经在 pop.swift
中设置了一个委托
//pop.swift
@objc protocol AnswerDelegate {
func isCorrectAnswer()
}
//UIViewController
extension UIViewController:AnswerDelegate{
//set the pop.xib delegate to self
// implement func isCorrectAnswer
}
我只是不确定如何使用委托来做我想做的事。
谢谢。
看看这个,你可以这样做。
Pop.swift
@objc protocol AnswerDelegate {
func isCorrectAnswer()
}
class Pop: UIView {
var answerDelegate: AnswerDelegate?
class func instanceFromNib() -> Pop {
return UINib(nibName: "Pop", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! Pop
}
@IBAction func sendDataToDbAction(_ sender: Any)
{
if(answer == false) {
//Alert
}
else {
answerDelegate?.isCorrectAnswer()
}
}
}
控制器:
class ViewController: UIViewController, AnswerDelegate {
func isCorrectAnswer() {
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let popView = Pop.instanceFromNib()
popView.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
popView.answerDelegate = self
self.view.addSubview(popView)
}
}
我不太确定您可以在扩展上执行此操作,因为您需要在视图控制器中的某个位置设置委托。
调整你的pop.swift调用委托函数如下:
@IBAction func sendDataToDbAction(_ sender: Any) {
if(answer == false) {
// show alert
} else {
delegate?.isCorrectAnswer()
}
}
在您的视图控制器中,设置委托并添加如下函数:
class MyViewController: UIViewController, AnswerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
pop.delegate = self
}
func isCorrectAnswer() {
}
}
首先您需要创建两个 类 一个是 UIViewController,一个是 XIB,如下所示。并添加一个协议及其委托函数。重写 viewController 中的委托方法以获得结果。
LoginVC.swift
import UIKit
class LoginVC: UIViewController, UITextFieldDelegate, RegisterViewDelegate {
func shiftRegisterViewUpDelegateFunction() {
if isRegister {
UIView.animate(withDuration: 1.1, delay: 0, options: .curveEaseIn, animations: {
self.registerView.transform = CGAffineTransform(translationX: 0, y: 0)
self.loginView.transform = CGAffineTransform(translationX: 0, y: 0)
})
isRegister = false
} else {
UIView.animate(withDuration: 1.1, delay: 0, options: .curveEaseIn, animations: {
var yaxis = CGFloat()
if GlobalConstants.kIphone_5 {
yaxis = -(1.0*self.loginView.frame.size.height)+150
} else {
yaxis = -(1.0*self.loginView.frame.size.height)+170
}
self.registerView.transform = CGAffineTransform(translationX: 0, y: yaxis)
self.loginView.transform = CGAffineTransform(translationX: 0, y: yaxis)
})
isRegister = true
}
}
override func viewDidLoad() {
super.viewDidLoad()
//Adding subviews
self.addSubviewsOverMainView()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
}
func addSubviewsOverMainView() {
registerView = Bundle.main.loadNibNamed("RegisterView", owner: self, options: nil)?[0] as! RegisterView
if GlobalConstants.kIphone_5 {
registerView.frame = CGRect(x: 0, y: self.view.frame.size.height-150, width: self.view.frame.size.width, height: self.view.frame.size.height)
}else {
registerView.frame = CGRect(x: 0, y: self.view.frame.size.height-150, width: self.view.frame.size.width, height: self.view.frame.size.height)
}
registerView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
self.view.addSubview(registerView)
registerView.delegate = self
}
}
RegisterXIB.swift
import UIKit
protocol RegisterViewDelegate {
func shiftRegisterViewUpDelegateFunction()
}
class RegisterView: UIView, UIScrollViewDelegate {
var delegate: RegisterViewDelegate?
var isRotated = Bool()
@IBOutlet weak var containerView: UIView!
@IBOutlet weak var formView: UIView!
@IBOutlet weak var shiftUpBtn: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
let scrollview = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.containerView.frame.size.width, height: self.containerView.frame.size.height))
scrollview.delegate = self
scrollview.contentSize = CGSize(width: self.containerView.frame.size.width, height: 500)
scrollview.showsVerticalScrollIndicator = true
scrollview.isScrollEnabled = true
scrollview.isUserInteractionEnabled = true
scrollview.backgroundColor = UIColor.clear
scrollview.addSubview(formView)
containerView.addSubview(scrollview)
}
@IBAction func shiftRegistrationUpAction(_ sender: Any) {
if isRotated {
UIView.animate(withDuration: 1.2) {
self.isRotated = false
self.shiftUpBtn.transform = .identity
}
} else {
UIView.animate(withDuration: 1.2) {
self.isRotated = true
self.shiftUpBtn.transform = CGAffineTransform(rotationAngle: .pi)
}
}
self.delegate?.shiftRegisterViewUpDelegateFunction()
}
}
我有点卡住了。
我有一个 UIViewController
和一个扩展 UIView
的自定义 pop.xib
。
pop.xib
连接到 pop.swift
。
在 UIViewController
中,一个按钮使 .xib
文件弹出。
并且在 pop.xib
中有一个按钮,单击该按钮可将一些数据发送到数据库。
但是当在 pop.xib
中单击该按钮发送数据时,我希望 UIViewController
到
a) 知道何时单击 @IBAction func sendDataToDbAction(_ sender: Any)
和
b) 当 sendDataToDbAction
内部的 if 语句 returns 为假时,则在 UIViewController
//pop.swift
class Pop: UIView {
@IBOutlet var delegate: AnswerDelegate?
@IBAction func sendDataToDbAction(_ sender: Any)
{
if(answer == false)
{
don't send to db
alert pops up saying answer is false
}
else
{
}
}
}
我已经在 pop.swift
中设置了一个委托//pop.swift
@objc protocol AnswerDelegate {
func isCorrectAnswer()
}
//UIViewController
extension UIViewController:AnswerDelegate{
//set the pop.xib delegate to self
// implement func isCorrectAnswer
}
我只是不确定如何使用委托来做我想做的事。
谢谢。
看看这个,你可以这样做。
Pop.swift
@objc protocol AnswerDelegate {
func isCorrectAnswer()
}
class Pop: UIView {
var answerDelegate: AnswerDelegate?
class func instanceFromNib() -> Pop {
return UINib(nibName: "Pop", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! Pop
}
@IBAction func sendDataToDbAction(_ sender: Any)
{
if(answer == false) {
//Alert
}
else {
answerDelegate?.isCorrectAnswer()
}
}
}
控制器:
class ViewController: UIViewController, AnswerDelegate {
func isCorrectAnswer() {
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let popView = Pop.instanceFromNib()
popView.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
popView.answerDelegate = self
self.view.addSubview(popView)
}
}
我不太确定您可以在扩展上执行此操作,因为您需要在视图控制器中的某个位置设置委托。
调整你的pop.swift调用委托函数如下:
@IBAction func sendDataToDbAction(_ sender: Any) {
if(answer == false) {
// show alert
} else {
delegate?.isCorrectAnswer()
}
}
在您的视图控制器中,设置委托并添加如下函数:
class MyViewController: UIViewController, AnswerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
pop.delegate = self
}
func isCorrectAnswer() {
}
}
首先您需要创建两个 类 一个是 UIViewController,一个是 XIB,如下所示。并添加一个协议及其委托函数。重写 viewController 中的委托方法以获得结果。
LoginVC.swift
import UIKit
class LoginVC: UIViewController, UITextFieldDelegate, RegisterViewDelegate {
func shiftRegisterViewUpDelegateFunction() {
if isRegister {
UIView.animate(withDuration: 1.1, delay: 0, options: .curveEaseIn, animations: {
self.registerView.transform = CGAffineTransform(translationX: 0, y: 0)
self.loginView.transform = CGAffineTransform(translationX: 0, y: 0)
})
isRegister = false
} else {
UIView.animate(withDuration: 1.1, delay: 0, options: .curveEaseIn, animations: {
var yaxis = CGFloat()
if GlobalConstants.kIphone_5 {
yaxis = -(1.0*self.loginView.frame.size.height)+150
} else {
yaxis = -(1.0*self.loginView.frame.size.height)+170
}
self.registerView.transform = CGAffineTransform(translationX: 0, y: yaxis)
self.loginView.transform = CGAffineTransform(translationX: 0, y: yaxis)
})
isRegister = true
}
}
override func viewDidLoad() {
super.viewDidLoad()
//Adding subviews
self.addSubviewsOverMainView()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
}
func addSubviewsOverMainView() {
registerView = Bundle.main.loadNibNamed("RegisterView", owner: self, options: nil)?[0] as! RegisterView
if GlobalConstants.kIphone_5 {
registerView.frame = CGRect(x: 0, y: self.view.frame.size.height-150, width: self.view.frame.size.width, height: self.view.frame.size.height)
}else {
registerView.frame = CGRect(x: 0, y: self.view.frame.size.height-150, width: self.view.frame.size.width, height: self.view.frame.size.height)
}
registerView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
self.view.addSubview(registerView)
registerView.delegate = self
}
}
RegisterXIB.swift
import UIKit
protocol RegisterViewDelegate {
func shiftRegisterViewUpDelegateFunction()
}
class RegisterView: UIView, UIScrollViewDelegate {
var delegate: RegisterViewDelegate?
var isRotated = Bool()
@IBOutlet weak var containerView: UIView!
@IBOutlet weak var formView: UIView!
@IBOutlet weak var shiftUpBtn: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
let scrollview = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.containerView.frame.size.width, height: self.containerView.frame.size.height))
scrollview.delegate = self
scrollview.contentSize = CGSize(width: self.containerView.frame.size.width, height: 500)
scrollview.showsVerticalScrollIndicator = true
scrollview.isScrollEnabled = true
scrollview.isUserInteractionEnabled = true
scrollview.backgroundColor = UIColor.clear
scrollview.addSubview(formView)
containerView.addSubview(scrollview)
}
@IBAction func shiftRegistrationUpAction(_ sender: Any) {
if isRotated {
UIView.animate(withDuration: 1.2) {
self.isRotated = false
self.shiftUpBtn.transform = .identity
}
} else {
UIView.animate(withDuration: 1.2) {
self.isRotated = true
self.shiftUpBtn.transform = CGAffineTransform(rotationAngle: .pi)
}
}
self.delegate?.shiftRegisterViewUpDelegateFunction()
}
}