class A : UIViewController {
var b = B()
...
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = false
print("inside view will appear")
print(b.transferText) // Here showing Goku only
}
}
和第二课
class B : UIViewController{
var transferText = "Goku"
...
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.transferText = "vegeta"
}
}
所以当我点击 UINavigationBar 后退按钮时,基本上我必须将transferText从B类转移到A.任何帮助将不胜感激。
答案 0 :(得分:3)
使用静态变量来执行此操作
class B : UIViewController{
static var transferText = "Goku"
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
B.transferText = "vegeta"
}
}
使用
print(B.transferText)
或导航后使用,您可以使用完成处理程序,当导航返回时只需用文本调用该完成块。
答案 1 :(得分:1)
使用委托模式将是一个很好的解决方案,用于将数据从子节点传递到父节点(在您的情况下 - 从B类到A类),因为您说A类具有B类实例并且需要将数据发布回到事件发生时的父母。
1)在B类中声明一个协议。
import UIKit
protocol ClassBDelegate
{
func didUpdate(strTransferText : String)
}
class B: UIViewController
{
// Should have valid connection from your Interface builder to this function.
@IBAction func navBarBtnUpdateClickked(_ sender: AnyObject)
{
// on Navigation bar click,Update transferText and fire the delegate again.
transferText = "Updated Goku by navigation bar button tap"
didTapNavigationbarButton();
}
var transferText = "Goku" // Default.
var delegate : ClassBDelegate? // Declare a public variable to store delegate.
override func viewDidLoad()
{
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
// Update transferText and fire delegate.
transferText = "Updated Goku by navigation bar button tap"
didTapNavigationbarButton(); // fire delegate from ViewWill appear.
}
private func didTapNavigationbarButton() -> Void
{
// Need to notify Instance of A class from here.
// Using Delegation pattern!
if(delegate != nil)
{
delegate!.didUpdate(strTransferText: transferText);
}
}
}
2)在A类中确认ClassBDelegate并实现委托。
// Confirming to ClassB Delegate
class A: UIViewController,ClassBDelegate
{
var b : B?
override func viewDidLoad()
{
super.viewDidLoad()
// Setup a segue in storyboard to move from class A to Class B to get class B Instance.
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
b = segue.destination as? B
b?.delegate = self
print("inside Prepare for segue function of Class A")
print(b?.transferText) // Here showing Goku only(Default value).
}
internal func didUpdate(strTransferText: String)
{
print("Updated transferText in Class B " + strTransferText);
}
}
3)你去了,只要在B组按下按钮,你就会收到A类实例的回电。
希望这有助于探索最适合您的要求。
乐意提供帮助:)
答案 2 :(得分:0)
在B类中,您声明A类的属性
var a = A()
在B的viewWillDisappear中,把
a.transferText = "vegeta"
(你在A类中声明了属性transferText)。