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

时间:2018-05-31 06:26:35

标签: ios swift uinavigationcontroller

根据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。我该如何设置这些变量?

4 个答案:

答案 0 :(得分:1)

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

List<PersonWrapper> wrapperList = new ArrayList<>();

jrList.stream()
    .flatMap(jr -> seniorList.stream()
         .filter(sr -> jr.getName().equals(sr.getName()))
         .map(sr -> new PersonWrapper(jr, sr))
    )
    .forEach(wrapperList::add);

如果控制器处于堆叠状态,则会为其分配值。

答案 1 :(得分:1)

如果是小数据,请使用UserDefaults

这是您存储数据的方式:

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

这就是你得到它的方式:

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

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

struct ShareValue {
    static var UserNum: Int = 0
}

答案 2 :(得分:1)

请找到以下步骤来实施代表。

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

ViewcontrollerB.m

protocol ViewControllerDelegate
{
    func didUpdateViewController(_ number: NSNumber, myBoolean: Bool);
}

第2步: - viewcontrollerB里面的initalise对象

var delegate:ViewControllerDelegate?

第3步: - 现在从后面的函数调用这个委托。我正在考虑回来是弹出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)
    }

让我知道它是否有效

答案 3 :(得分:1)

创建一个其他视图控制器可以实现的委托,并在viewWillDisappearisMovingFromParentViewController

时在true中调用委托方法
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
    }
}