当前位置: 首页 > 知识库问答 >
问题:

如何在Swift中获取父视图控制器的类名?

蔚楷
2023-03-14

有没有办法在当前(子)UIViewController中获取父VC的类名?我的'子'VC(推送)有两个'父'UIViewController,所以我想知道哪一个是当前的父?

共有3个答案

莘翰采
2023-03-14

首先在视图控制器中添加扩展

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

现在像这样使用它

let vc = self.parentViewController

if let parentVC = self.parentViewController {
    if let parentVC = parentVC as? someViewController {
        // parentVC is someViewController
    } else if let parentVC = parentVC as? anotherViewController {
        // parentVC is anotherViewController
    }
}
壤驷涛
2023-03-14

更新至SWIFT 5

在子视图控制器中,可以尝试以下操作:

guard let parent = self.presentingViewController else{
    // ...some code
    return
}
//presented by parent view controller 1
if parent.isKind(of: Parent1.self){
    // do something
}else{
    //presented by parent view controller 2
}

我建议您将此逻辑放在您的viewWillEmerar方法中,因为当调用viewdiLoad时,不能保证视图控制器层次结构已加载到导航树中,并且类似于此的结果,演示ViewController子视图控制器的属性可能是nil

宁兴修
2023-03-14

这里有一种方法:

if let parentVC = self.parentViewController {
    if let parentVC = parentVC as? someViewController {
        // parentVC is someViewController
    } else if let parentVC = parentVC as? anotherViewController {
        // parentVC is anotherViewController
    }
}

首先,分配并有选择地展开self。parentViewController

第二,使用可选的铸造as?,并将视图控制器分配给括号VC,如果它工作的话。

也就是说,这是一种代码味道——子视图控制器通常不知道他们的父视图控制器是谁。不管你在解决什么问题,你都应该用告诉来解决,不要问,而是委托。

 类似资料:
  • 问题内容: 我需要一个根视图控制器实例。 我尝试了这些方法: 返回: null : 另外,当我尝试获取控制器数组时: 它仅返回一个控制器,但不是我的根视图控制器。 如果我尝试从导航控制器中获取: 返回: null : 有什么想法吗?我还能尝试获得根视图控制器的一个实例吗? 谢谢。 问题答案: 如果您尝试访问在appDelegate中设置的。试试这个: 目标C 迅速 迅捷3 迅捷4和4.2 雨燕5&

  • 我想做的是: 由父视图控制器管理的父视图不应旋转。 由子视图控制器管理的子视图应该旋转到所有方向。 我所尝试的: 家长视图控制器 儿童视图控制器 Xcode部署信息中支持的方向设置为所有四个。 我得到的: 没有视图的旋转。如果将父视图的旋转设置为“全部”,则所有视图将一起旋转。所以要么全有要么全无。 更新 当我尝试放置UIDeviceOrientationIDChangeNotification的

  • 如果我有一个子类,如何将类名获取为string?我试过做,但这会返回对象,而不是。

  • 问题内容: 我在开发基于SpriteKit的游戏时对视图控制器以及如何以一种干净的方式处理它们有一个一般性的问题。 我到目前为止所做的: 仅将情节提要板用于定义视图控制器 SKScene在presentScene的每个视图控制器(Home,LevelSelection,Game)中都有显示 在每个视图控制器中,我使用在视图控制器之间的情节 提要中 定义的标识符调用 performSegueWith

  • 我有一组视图和一个注销按钮,它将用户注销并将他们带到第一个视图控制器(一个登录/注册屏幕)。我试着用模态表示来做这件事,但它破坏了我的导航,而且我不能使用pop到根视图控制器,因为它不是根视图控制器--我至少有2个导航控制器的深度。我怎么可能只显示第一个呢?我基本上需要它的行为,就好像应用程序刚刚重新启动。解开塞格会有什么帮助吗?谢谢

  • 问题内容: 我为其中一个页面设置了一个版式,然后使用大量的小视图作为种子,这些小视图用于填充日期。我的状态目前看起来像这样: 如您所见,父布局将我的Controller保留在称为 EventCtrl 的页面上。现在,我希望所有视图现在都可以访问此控制器,但事实并非如此。相反,我必须将来自 eventLayout 的主要父模板包装到div中,然后在其中使用旧学校: 我至少想了解为什么会发生这种情况,