【问题标题】:How to get parent of child view controller?如何获取子视图控制器的父级?
【发布时间】:2018-07-19 07:28:37
【问题描述】:

我有一个带有分段控制的视图控制器 A,并且我在控制器 A 中添加了两个视图控制器的(B 和 C)视图,用于不同的段选择。我在控制器 B 和控制器 C 上各有一个按钮。点击每个控制器 B 和控制器 C 的按钮,我要去controllerD。

我如何知道我来自哪个控制器?

我尝试了下面的代码,但我认为由于控制器 (B & C) 添加到控制器 A 的视图,它给了我零。

guard let parent = self.parent else {return}

在这种情况下如何获得父母?

【问题讨论】:

  • 你试过 self.presentingViewController 了吗?
  • 如果您以模态方式呈现 D,那么您可以说 self.presentingViewController 以获取对父级的引用,或者如果它被推送,您可以在 D 中说 self.parent 以获取父级视图控制器
  • 稍微不同的是,您始终可以在 ViewController D 中声明一个名为 parent 的弱引用声明一个协议并让您的 ViewController B 和 C 确认它并将您的 ViewController B 或 C 的实例传递给 D在展示或推动时。使用协议方法触发B和C中的方法
  • 实际上,如果您将viewController 添加为孩子,那么您将能够获得您尝试过的方式。否则,在不知道您导航的方式的情况下很难分辨。您可能需要分享更多关于如何添加/呈现 BCD ViewControllers 的代码
  • self.presentingViewController 也给我 nil。

标签: ios swift uiviewcontroller parentviewcontroller


【解决方案1】:

我曾经使用过的稍微不同的解决方案:

  • 用发送者 A、B、C 等声明一个枚举。

    enum Sender {
        case A
        case B
        case C
    }
    
  • 在 D 中放入一个名为 sender 的变量。

     var sender : Sender!
    
  • 在初始化 VC 集时,它是各自的发送者。如果您正在使用 segue,请使用准备 segue 来设置值。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
        if segue.identifier == "D" {
            let vc = segue.destination as! D
            vc.sender = B or C //As required
        }
    }
    

然后您可以使用 sender 的值根据发件人做任何您想做的事情。这里的好处是,如果您继续导航,您始终可以将 sender 值传播到下一个 ViewController。

【讨论】:

  • 感谢您的解决方案,但问题是我没有使用 segue,因为我正在创建控制器 (B & C) 的 xib,然后将这些控制器视图添加到控制器 A,然后导航到控制器 D跨度>
  • 如何导航到控制器 D?你是展示它还是把它推到 A 上?
  • 我通过控制器(B&C)视图内的按钮单击导航到控制器D,这些视图作为子视图添加到viewControllerA。我正在使用self.present导航到控制器D
  • 你可以这样做: let vc = MyViewController(nibName: "D", bundle: nil); vc.sender = B 或 C; self.present(vc, 动画: true, 完成: nil);
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多