如何在navigationController swift中设置后按变量?

Posted

技术标签:

【中文标题】如何在navigationController swift中设置后按变量?【英文标题】:how to set variables on back press in navigationController swift? 【发布时间】:2018-05-31 06:26:35 【问题描述】:

根据 this link ,我想在后按时将 B viewController 的一些数据传递给其父 A viewController!这是我的代码: 在我的 B viewController 中,我添加了这段代码 -

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

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

    

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

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

当我打开B控制器时,会调用navigationController (willShow),当我按下返回键时,会先调用viewWillAppear,然后再调用B控制器中的navigationController(willShow)!所以我的数据没有设置,number 将永远是 -1 。如何设置这些变量?

【问题讨论】:

使用延迟实现它的最佳方法。 见这个例如***.com/questions/34955987/… @ketakiDamale 你能给我写个例子吗? @Anbu.karthik 我使用的正是这个问题和已检查的答案!但它不起作用,也许我实施错了:( @AzinNilchi 使用UserDefaults 怎么样? 【参考方案1】:

请找到以下步骤来实现委托。

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

ViewcontrollerB.m

protocol ViewControllerDelegate

    func didUpdateViewController(_ number: NSNumber, myBoolean: Bool);

第 2 步:- 在 viewcontrollerB 中初始化对象

var delegate:ViewControllerDelegate?

第 3 步:- 现在从back函数调用这个delegate。这里我考虑back是pop viewcontroller的函数。

func Back()

    delegate?.didUpdateViewController(numberInB!, myBoolean: boolInB!)

第 4 步:- 继承 viewcontrollerA 中的协议。

class ViewControllerA: UIViewController,ViewControllerDelegate

第 5 步:- 现在在 viewcontrollerA 中设置委托。

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)
    

让我知道它是否有效

【讨论】:

【参考方案2】:

在控制器 B 的 viewWillDisappear 中调用它:

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
    

如果控制器在堆栈中,则将值分配给它。

【讨论】:

我使用了您的答案,它非常适合我的工作!谢谢【参考方案3】:

如果是小数据则使用UserDefaults:

这是您存储数据的方式:

UserDefaults.standard.set(1, forKey: "Key")

这就是你找回它的方式:

UserDefaults.standard.integer(forKey: "Key")

或者您可以使用带有静态变量的结构:

struct ShareValue 
    static var UserNum: Int = 0

【讨论】:

【参考方案4】:

isMovingFromParentViewControllertrue 时,创建一个其他视图控制器可以实现的委托并在viewWillDisappear 中调用委托方法

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
    
 

【讨论】:

以上是关于如何在navigationController swift中设置后按变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ViewController 及其 NavigationController 上添加 UIview

如何在 UIPopOverController 中嵌套 navigationController?

如何在 iPhone 上的 UIPopoverController 中显示 NavigationController-background

如何在没有 NavigationController 的情况下推送子 ViewController?

弹出 NavigationController 时应用程序崩溃!

如何在 tableview 搜索栏中获取对 navigationcontroller 的引用?