Ios 如何在navigationController swift中设置背压变量?

Ios 如何在navigationController swift中设置背压变量?,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,根据,我想将一些数据从一个BviewController传递到它的父级,即一个viewController,然后按back press!这是我的密码: 在我的BviewController中,我添加了以下代码- extension Bcontroller: UINavigationControllerDelegate { func navigationController(_ navigationController: UINavigationController, willSh

根据,我想将一些数据从一个B
viewController
传递到它的父级,即一个
viewController
,然后按back press!这是我的密码: 在我的B
viewController
中,我添加了以下代码-

    extension Bcontroller: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {

        (viewController as? Acontroller)?.number = numberInB
        (viewController as? Acontroller)?.myBoolean = boolInB

    }
}
这是我在控制器中的代码:

override func viewWillAppear(_ animated: Bool) {
    if number != -1 {
        print(myBoolean)
    }
}

当我打开B控制器时,会调用
navigationController(willShow)
,当我按下后退按钮时,会首先调用
ViewWillDisplay
,然后调用B控制器中的
navigationController(willShow)
!因此,我的数据未设置,
number
将始终为
-1
。如何设置这些变量?

在控制器B的视图中调用它:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    let navigationController: UINavigationController = self.navigationController!

    let controllers: [Acontroller] = navigationController.viewControllers.filter({ $0 is Acontroller }) as! [Acontroller]

    if let viewController: Acontroller = controllers.first {
        viewController.number = numberInB
        viewController.myBoolean = boolInB
    }
}

如果控制器在堆栈中,将为其分配值。

在控制器B的视图中调用它:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    let navigationController: UINavigationController = self.navigationController!

    let controllers: [Acontroller] = navigationController.viewControllers.filter({ $0 is Acontroller }) as! [Acontroller]

    if let viewController: Acontroller = controllers.first {
        viewController.number = numberInB
        viewController.myBoolean = boolInB
    }
}

如果控制器在堆栈中,将为其分配值。

如果是小数据,则使用
UserDefaults

这是存储数据的方式:

UserDefaults.standard.set(1, forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
这就是你找回它的方式:

UserDefaults.standard.set(1, forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
也可以将结构与静态变量一起使用:

struct ShareValue {
    static var UserNum: Int = 0
}

如果是小数据,则使用
UserDefaults

这是存储数据的方式:

UserDefaults.standard.set(1, forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
这就是你找回它的方式:

UserDefaults.standard.set(1, forKey: "Key")
UserDefaults.standard.integer(forKey: "Key")
也可以将结构与静态变量一起使用:

struct ShareValue {
    static var UserNum: Int = 0
}

请查找以下步骤以实现委派

步骤1:-在视图控制器B中初始化协议

ViewcontrollerB.m

protocol ViewControllerDelegate
{
    func didUpdateViewController(_ number: NSNumber, myBoolean: Bool);
}
第2步:- 初始化viewcontrollerB内的对象

var delegate:ViewControllerDelegate?
第3步:- 现在从back调用这个委托函数。这里我考虑的是back是弹出viewcontroller的函数

func Back()
{
    delegate?.didUpdateViewController(numberInB!, myBoolean: boolInB!)
}
第4步:- 在viewcontrollerA中继承协议

class ViewControllerA: UIViewController,ViewControllerDelegate
第5步:- 现在在viewcontrollerA中设置代理

class ViewControllerA: UIViewController,ViewControllerDelegate
ViewcontrollerA.m

override func viewDidLoad() {
    super.viewDidLoad()
    let obj = ViewControllerB()//Initialize it as per your code
    obj.delegate = self;
    // Do any additional setup after loading the view, typically from a nib.
}
最后一步:- 重写委托方法

   func didUpdateViewController(_ number: NSNumber, myBoolean: Bool) {
        print(number,myBoolean)
    }

让我知道它是否有效

请查找以下步骤以实现委派

步骤1:-在视图控制器B中初始化协议

ViewcontrollerB.m

protocol ViewControllerDelegate
{
    func didUpdateViewController(_ number: NSNumber, myBoolean: Bool);
}
第2步:- 初始化viewcontrollerB内的对象

var delegate:ViewControllerDelegate?
第3步:- 现在从back调用这个委托函数。这里我考虑的是back是弹出viewcontroller的函数

func Back()
{
    delegate?.didUpdateViewController(numberInB!, myBoolean: boolInB!)
}
第4步:- 在viewcontrollerA中继承协议

class ViewControllerA: UIViewController,ViewControllerDelegate
第5步:- 现在在viewcontrollerA中设置代理

class ViewControllerA: UIViewController,ViewControllerDelegate
ViewcontrollerA.m

override func viewDidLoad() {
    super.viewDidLoad()
    let obj = ViewControllerB()//Initialize it as per your code
    obj.delegate = self;
    // Do any additional setup after loading the view, typically from a nib.
}
最后一步:- 重写委托方法

   func didUpdateViewController(_ number: NSNumber, myBoolean: Bool) {
        print(number,myBoolean)
    }

让我知道它是否有效

创建一个委托,当
从父视图控制器移动时,其他视图控制器可以实现该委托并调用
视图中的委托方法将消失

public protocol YourViewControllerDelegate: class {
    func didGoBack(viewController: YourViewController)
}

public class YourViewController: UIViewController {
    public weak var delegate: YourViewControllerDelegate?

    public override func viewWillDisappear(_ animated: Bool) {
        if isMovingFromParentViewController {
            delegate?.didGoBack(viewController: self)
        }
    }
}
在其他视图控制器中:

extension YourOtherViewController: YourViewControllerDelegate {
    public func didGoBack(viewController: YourViewController) {
        // Do something e.g. set your variables
    }
} 

创建一个委托,当
从父视图控制器移动时,其他视图控制器可以实现并调用
视图中的委托方法将消失

public protocol YourViewControllerDelegate: class {
    func didGoBack(viewController: YourViewController)
}

public class YourViewController: UIViewController {
    public weak var delegate: YourViewControllerDelegate?

    public override func viewWillDisappear(_ animated: Bool) {
        if isMovingFromParentViewController {
            delegate?.didGoBack(viewController: self)
        }
    }
}
在其他视图控制器中:

extension YourOtherViewController: YourViewControllerDelegate {
    public func didGoBack(viewController: YourViewController) {
        // Do something e.g. set your variables
    }
} 

使用delagation是实现这一目标的最佳方法。参见此,例如@ketakiDamale,你能给我写一个例子吗?@Anbu.karthik我正是使用了这个问题,并检查了答案!但是它不起作用,也许我实现了错误:(@AzinNilchi使用
UserDefaults
?使用delagation实现它的最佳方法是什么?请看下面的例子@ketakiDamale你能给我写个例子吗?@Anbu.karthik我使用了这个问题,答案已经检查过了!但是它不起作用,也许我实现了错误:(@AzinNilchi使用
UserDefaults
怎么样?我使用了你的答案,它对我的工作非常有效!谢谢你我使用了你的答案,它对我的工作非常有效!谢谢你