给定一个视图,我如何获取它的viewController?

2023-12-09

我有一个指向UIView。我如何访问它UIViewController? [self superview]是另一个UIView,但不是UIViewController, right?


来自UIResponder的文档nextResponder:

UIResponder 类不会自动存储或设置下一个响应者,而是默认返回 nil。子类必须重写此方法才能设置下一个响应者。UIView 通过返回管理它的 UIViewController 对象(如果有)或其超级视图(如果没有)来实现此方法; UIViewController 通过返回其视图的超级视图来实现该方法; UIWindow返回应用程序对象,UIApplication返回nil。

所以,如果你递归一个视图nextResponder直到它是类型UIViewController,那么你就有了任何视图的父视图控制器。

请注意,它仍然可能not有一个父视图控制器。但前提是该视图不属于 viewController 的视图层次结构的一部分。

斯威夫特 3 和斯威夫特 4.1扩大:

extension UIView {
    var parentViewController: UIViewController? {
        // Starts from next (As we know self is not a UIViewController).
        var parentResponder: UIResponder? = self.next
        while parentResponder != nil {
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
            parentResponder = parentResponder?.next
        }
        return nil
    }
}

斯威夫特 2 扩展:

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

Objective-C 类别:

@interface UIView (mxcl)
- (UIViewController *)parentViewController;
@end

@implementation UIView (mxcl)
- (UIViewController *)parentViewController {
    UIResponder *responder = [self nextResponder];
    while (responder != nil) {
        if ([responder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)responder;
        }
        responder = [responder nextResponder];
    }
    return nil;
}
@end

这个宏避免了类别污染:

#define UIViewParentController(__view) ({ \
    UIResponder *__responder = __view; \
    while ([__responder isKindOfClass:[UIView class]]) \
        __responder = [__responder nextResponder]; \
    (UIViewController *)__responder; \
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个视图,我如何获取它的viewController? 的相关文章

  • 从 Google/Facebook 帐户重新验证用户身份

    因此 我需要创建一个 REST API 来为 IOS 应用程序提供功能 我们允许用户仅使用普通帐户或使用脸书 谷歌登录 我最近一直在阅读 OAuth 我想我了解在我的情况下如何使用 OAuth 的过程 当用户使用脸书 谷歌登录 在我的应用程
  • iOS 显示 UIImage 全屏并启用缩放(捏合和双击)

    我有一个UIImage从相机捕获UIImagePickerController 现在 在用户单击它之后 我希望它显示全屏 并且能够使用捏合手势进行放大和缩小 还可以使用双击手势来放大特定区域 换句话说 我想模拟ios默认图像浏览器的功能 我
  • 平板电脑在第一次单击时悬停,在第二次单击时单击

    发布这个问题主要是希望证实我对该行为的怀疑 从而为其他程序员记录下来 因为我在网上没有找到任何记录 我正在构建一个网站 其导航栏具有以下属性 水平截面是 ul of li 和一些 li li s 两者都有 A n a 元素带您进入该主题 触
  • 如何在文本末尾添加按钮,如 Facebook 的“继续阅读”?

    当状态帖子太长时 Facebook 应用程序会剪切文本并在末尾添加 继续阅读 它如何知道在哪里剪切文本并添加 继续阅读 不仅仅是向 textView 或标签添加按钮 而是如何剪切字符串 例如 在下图中 我将行数限制为 7 我可以在 text
  • scrollToRowAtIndexPath:atScrollPosition:动画滚动太慢

    基于分页 UIScrollView 的页面更改 我正在调用scrollToRowAtIndexPath atScrollPosition animated到所显示的该页面的表详细信息 void scrollViewDidScroll UIS
  • 使用 UINavigationController 从右向左推送 ViewController

    大家都知道UINavigationController从左到右推送ViewController 有没有办法从右到左推送View 就像后退按钮的动画一样 现在我有这个 self navigationController pushViewCon
  • 如果您查看内部,nib 文件到底是什么样子的?

    我刚刚学习 nibs 和 swift 并对某些东西感到好奇 我知道 如果您有一个 main storyboard 文件 则首先加载根视图控制器的笔尖 然后加载该视图控制器下可能分层存在的任何视图 但是 我想知道一些事情 当他们说笔尖已 加载
  • 如何在 iPhone 应用程序的 url 中传递字符串值

    NSURLRequest request NSURLRequest requestWithURL NSURL URLWithString http www krsconnect no community api html method ba
  • 当 iPhone 设备方向朝上/朝下时,我可以判断它是横向还是纵向吗?

    我得到这个代码 如果设备处于左 右横向或上下颠倒状态 它会旋转并显示另一个视图控制器 但如果它的方向朝上或朝下 那么我如何判断它是横向模式还是纵向模式 因为我只想在它面朝上或朝下以及横向模式下旋转 void viewDidAppear BO
  • 使用捏合手势;如何放大用户手指实际“捏”的位置?

    我已经在我的应用程序中的 UIImageView 上实现了 UIPinchGestureRecognizer 但是无论我在图像的哪个位置捏合 它似乎都会放大到同一个位置 有谁知道我如何让它放大到用户实际 捏 的地方 请参阅下面的代码 视图控
  • 我可以使用 NSDateFormatter 将此日期字符串转换为 NSDate 吗?

    我有这个字符串 2010 08 24T16 00 00 05 00 我想从中提取时间部分 即 16 00 并将其转换为 12 小时等效值 即下午 04 00 我正在尝试使用 NSDateFormatter 来完成此任务 但它不起作用 NSD
  • Swift NotificationCenter 删除观察者最快的方法

    我正在添加一些观察员viewController applicationWillResignActive applicationDidEnterBackground 以及许多其他人 我想删除self作为一行中所有已注册通知的观察者 我的问题
  • .net 垃圾收集器何时运行?

    当我调试 net 代码时 如何知道垃圾收集器何时运行 我不想控制垃圾收集器何时运行 我只希望能够知道它何时运行 我有一些代码资源不足 我知道资源没有被使用 我想知道 GC 何时运行以释放它们 哦 我想到的资源是来自 Sql 连接池的连接 而
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • iOS 复合谓词

    我正在编写一个具有照片数据库的应用程序 每张照片都有多个与之关联的标签 并且该应用程序有一个带有大量切换的搜索页面 允许用户仅根据他们感兴趣的标签搜索照片 每个标签都存储了integerID 是因为它们对应于外部数据库的 ID 所以我尝试简
  • 使用导航控制器在 Storyboard 中呈现视图控制器 - Swift

    我目前在下面的新故事板中显示了一个 viewController var storyboard UIStoryboard UIStoryboard name AccountStoryboard bundle nil var vc Welco
  • 为什么 iOS 5.0 不喜欢纯窗口应用程序?为什么它要求使用视图控制器?

    我有一个使用 Xcode 4 0 的 基于窗口的应用程序 模板创建的 iOS 应用程序 当时运行良好 并且使用的是 iOS 4 3 SDK 这是一个简单地将按钮 标签等直接放置到窗口上的应用程序 没有视图控制器 什么都没有 但现在我已经升级
  • 如何在GDB中重新运行程序多次?

    我有一个程序偶尔会失败 但出现相同的错误 为了调试它 我想在 GDB 下运行它 直到它失败 设置断点并重新运行它 我该怎么办 gdb args path to program
  • 如何远程调试Lua?

    我正在寻找远程调试 Lua 的最佳方法 例如从网络浏览器 I saw RemDebug http www keplerproject org remdebug 但最后一次项目更新是在 2006 年完成的 它适用于 Lua 5 0 和 5 1
  • UINavigationController 在后退按钮单击时向下滚动

    我正在开发一个带有多个导航控制器的 iPhone iPad 应用程序 当我在设备处于横向模式时单击视图的后退按钮时 前一个视图会垂直滚动到屏幕中 而不是像往常一样水平滚动 推送动画始终水平工作 正如它应该的那样 是什么导致了这个奇怪的问题

随机推荐

  • 在 Pig 中的 ToDate(unix) 中指定时区

    在我的数据集中 我有 Unix 时间戳中的日期 我想将它们转换为 Apache Pig 中的日期时间 为此我可以使用ToDate 功能如所描述here 不过我知道我的 Unix 时间戳是 GMT UTC 但是使用转换ToDate 将导致我当
  • Python argparse 组合标志和变量

    我希望能够为我的程序指定一个选项 该选项既充当标志又充当变量 例如 我有一个名为 logging 的论点 如果未指定此参数 我希望将其设置为 false 即 action store true 但如果指定了该参数 我想做两件事 1 我想设置
  • 在android中使用本机opencv FileStorage

    我正在尝试编写一个 Android 应用程序 使用 opencv 计算关键点和描述符并存储它们 但是我在 cv FileStorage 方面遇到了麻烦 我实际上是通过文件路径抛出本机方法 相同的路径 不同的文件结尾 还用于在javaside
  • 房间持久性:错误:实体和 Pojo 必须具有可用的公共构造函数

    我正在将一个项目转换为 Kotlin 并且尝试将我的模型 也是我的实体 设为数据类 我打算使用 Moshi 转换来自 API 的 JSON 响应 Entity tableName movies data class MovieKt Prim
  • 在哪里可以找到并下载不同版本的 mscorwks.dll 和 mscordacwks.dll?

    我试图习惯使用 WinDbg 在能够获取故障转储时对其进行故障排除 但每次我这样做时 它似乎都会要求我提供不同版本的 mscorwks dll 和 mscordacwks dll 而我不这样做并不总是能够访问转储来源的机器 除了告诉最终用户
  • IOException 无法解析为类型错误

    在我的 Java 期末考试中 我们有一个关于 try catch 和 finally 调用的测试 异常 部分 当我尝试将示例代码放入 Eclipse 中时 我在 catch 和 throw 新区域中遇到错误 所有错误都显示 无法解析为类型
  • 通过主题自定义 Woocommerce 中的产品类别面包屑链接

    我正在尝试修改class wc breadcrumb php自定义我的产品页面面包屑中的产品类别链接 该文件位于 wp content plugins woocommerce includes 我尝试将子主题中的此文件复制并编辑为 wp c
  • 如何在ruby中仅在内存中创建zip文件?

    我想创建给定目录中所有 HTML 文件的 zip 文件 该 zip 文件将作为附件与目录中的其余文件一起通过电子邮件发送 到目前为止 如果我从 pony 发送任何附件是 HTML 文件 我尝试过的所有电子邮件客户端都无法阅读电子邮件 所以我
  • python中的//=有什么作用? [复制]

    这个问题在这里已经有答案了 我正在阅读http learnpythonthehardway org book ex37 html但我不明白是什么 符号确实如此 我感觉合理 a 9 a 3 a 3 gt True But a 9 a 3 a
  • 使用 igraph 中的 graph.tree 函数绘制树

    在 igraph 包的文档中有一个示例 igraph options plot layout layout reingold tilford plot graph tree 20 2 输出应将数据表示为树 但我得到的是 您显然需要指定根 l
  • 如何避免回调与 Promise 的嵌套结构? [完成的]

    我使用承诺来避免回调创建的嵌套结构 然而在这段代码中我仍然有一些嵌套 我做错了什么还是在这种情况下这是不可避免的 在这种情况下 我想检查并查看配置文件是否存在 如果不存在 我想创建它 DB getProfile id google then
  • 文章类别:加载顺序重要吗?

    我一直在网上搜索 试图找到我的问题的答案 但似乎找不到直接的答案 我在工作中经常使用文章类 但从来没有真正需要知道它们是否按顺序加载 即页面上首先出现的内容 Example div class example1 example2 examp
  • 有没有办法在 VSTS 发布管理中执行嵌套变量

    我在变量组中创建了一些具有以下名称的变量 CodeNetworkShare Dev CodeNetworkShare Test CodeNetworkShare Prod 我在发布定义中导入了这个变量组 然后我尝试了以下方法在发布定义中使用
  • 将 coxph 摘要从 R 导出到 csv

    如何将 cox proportional 危险模型的摘要从 R 导出到 csv 我通过函数 coxph 进行了测试 通过生存包 现在我想将其摘要导出到 csv 该怎么做 c lt coxph Surv x y summary c 我认为你需
  • 如何在 blazor 页面上使用 usermanager?

    你好社区我有一个问题如何使用usermanager in a blazor页面网络组装 通过注入 inject UserManager
  • 将未知编码的TXT文件转换为字符串

    如果编码类型未知 如何将纯文本 txt 文件转换为字符串 我正在开发一项功能 允许用户将 txt 文件导入到我的应用程序中 这意味着该文件可以在任意数量的应用程序中创建 使用对纯文本文件有效的各种编码中的任何一种 我的理解是这可能包括 AS
  • stopPropagation 阻止显示引导程序的对话框

    我在 div 内有一个按钮 div div
  • 预期的标识符、字符串或数字

    我有一个像这样的对象 var defaults id ActionSlider element closeBtnWidth 55 panelWidth 320 class css create function 当我以 IE8 标准运行页面
  • 替换长 URL 的一部分并重定向

    有没有办法重定向 URL 如下所示 URL是基于过滤系统生成的 所以它是这样的 https example com product category no slash generated part is autoadded here 由于产
  • 给定一个视图,我如何获取它的viewController?

    我有一个指向UIView 我如何访问它UIViewController self superview 是另一个UIView 但不是UIViewController right 来自UIResponder的文档nextResponder UI