如何在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】:当isMovingFromParentViewController
为true
时,创建一个其他视图控制器可以实现的委托并在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?