子视图控制器如何使用Parentviewcontroller中定义的方法

2023-12-29

我遇到的情况是,子视图控制器尝试显示多个视图控制器,并且在执行该操作时,子视图控制器需要从父视图控制器访问播放暂停操作方法。如何实现这一点,子视图控制器可以使用在父视图控制器中定义的播放暂停操作方法,该方法用于暂停音频播放器、暂停计时器和暂停层:self.view.layer。

我将非常感谢为解决此问题提供的各种帮助。

Thanks


您可以使用以下命令访问视图控制器的父级parentViewController财产。

if([self.parentViewController isKindOfClass:[SomeViewController class]]) {
    SomeViewController* viewController = (SomeViewController*)self.parentViewController;

    [viewController foo];
}

但是,这取决于视图控制器之间的关系。从你的问题我推断你是有多个孩子的亲子关系,如有错误请指正!这与模态视图控制器呈现非常不同,在模态视图控制器呈现中仅呈现一个视图控制器并且需要用户立即注意。

解释:

对于两者之间的区别似乎有些混乱parentViewController and presentingViewControllerUIViewController 上的属性。有两种不同的视图控制器关系,每种关系都适用于这些属性之一。

如果您希望添加多个视图控制器的视图作为父视图控制器的子视图,您可以使用视图控制器遏制 https://stackoverflow.com/questions/8379759/how-does-view-controller-containment-work-in-ios-5。在这种情况下,任何作为父视图控制器的子视图(子视图)添加的视图都将返回父视图控制器(控制子视图的父视图;父视图)。parentViewController属性被访问。在这种情况下,presentingViewController财产回报null.

例如,在父视图控制器中:

- (void)viewDidLoad {
    [super viewDidLoad];

    SomeViewController* someVC = [[SomeViewController alloc] init];

    [self addChildViewController:someVC];
    [self.view addSubview:someVC.view];
    [someVC.view setFrame:<SOME_FRAME>];
    [someVC didMoveToParentViewController:self];

    AnotherViewController* anotherVC = [[AnotherViewController alloc] init];

    [self addChildViewController:anotherVC];
    [self.view addSubview:anotherVC.view];
    [anotherVC.view setFrame:<ANOTHER_FRAME>];
    [anotherVC didMoveToParentViewController:self];

    /* this prints self */
    NSLog(@"%@", someVC.parentViewController);

    /* this prints null */
    NSLog(@"%@", someVC.presentingViewController);


    /* this prints self */
    NSLog(@"%@", anotherVC.parentViewController);

    /* this prints null */
    NSLog(@"%@", anotherVC.presentingViewController);
}

相反,如果您只是希望呈现一个单一的模态视图控制器(这种情况比上面的一对多父子关系更常见),那么presentingViewController财产被使用。

例如,在呈现视图控制器中:

- (void)someActionTriggered {
    SomeViewController* viewController = [[SomeViewController alloc] init];
    
    [self presentViewController:viewController animated:YES completion:nil];

    /* this prints null */
    NSLog(@"%@", viewController.parentViewController);

    /* this prints self, or a tab bar controller if 'self' is contained in one */
    NSLog(@"%@", viewController.presentingViewController);
}

虽然presentingViewController由于 iOS 中模态视图控制器模式的盛行,视图控制器包含父子关系是绝对合法的,并且视图控制器的父子关系是绝对合法的。parentViewController and childViewControllerUIViewController 的属性有not自 iOS 5 起已被弃用,它们的用途刚刚发生了变化。您可以阅读文档中的这段摘录:

讨论

如果接收者是容器视图控制器的子级,则此属性保存其所在的视图控制器。如果接收者没有父级,则此属性中的值为 nil。

在 iOS 5.0 之前,如果视图没有父视图控制器并且正在呈现,则将返回呈现的视图控制器。在 iOS 5 上,此行为不再发生。相反,使用presentingViewController 属性来访问呈现视图控制器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子视图控制器如何使用Parentviewcontroller中定义的方法 的相关文章

  • 将第 3 方库添加到 iPhone 应用程序时如何设置“标题搜索路径”的路径

    我想添加第 3 方库语音转文本 https github com todoroo iPhone Speech To Textto my Xcode项目 我只是拖xcodeproj文件在我的 iPhone 项目中 然后我按照目标依赖项 将二进
  • 无法使用 NSDateFormatter 解析日期

    我正在获取 RSS 其中我收到以下日期戳 2010 05 10T06 11 14 000Z 现在我正在使用 NSDateFormatter 来解析这个日期时间戳 parseFormatter setDateFormat yyyy MM dT
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 如何在 UILabel 上创建强烈的红光效果

    我需要在 UILabel 或 CATextLayer 上实现外发光效果 如上所述 我知道要在文本上创建发光效果 我需要偏移量为 0 0 的阴影 我已经接触到quartz2D级别 以下是我正在使用的代码 backgroundDownLabel
  • iPhone,sqlite3,如何尽可能用几行代码确定一个表是否已经存在?

    在开始再次向表添加数据之前 如何以尽可能少的代码行确定表中已经存在 如果直接使用sqlite 可以使用以下查询来查看表是否已经存在 SELECT name FROM sqlite master WHERE type table AND na
  • Swift 自定义 UITableViewCell 标签始终为零

    我已经被这个问题困扰好几天了 所以如果有人能提供帮助 我会很高兴 我正在尝试创建一个动态 UITableView 为此我创建了一个自定义 UITableView 子类 并且还创建了一个自定义 UITableViewCell 子类 因为我需要
  • 将文件上传到 Google 云端硬盘时出错

    我已经在我的应用程序项目中实现了 Google Drive SDK 并尝试在 Google Drive 中上传图像 但出现错误 我的代码来自Here https developers google com drive quickstart
  • iPhone iOS 是否有用于类似代数计算器的应用程序的表达式解析器?

    我正在构建一个应用程序 可以通过加速度计和陀螺仪输出来分析手机的运动 我很可能会将这个动作捕获为一组变量 应用程序将在内部跟踪这些变量 我试图提供一种方法来绘制这些变量和涉及这些变量的方程 我想让用户能够通过输入 a b c d 等方程 其
  • 带故事板的 viewController 自定义 init 方法

    我在重写故事板中设计的自定义 ViewController 的初始化方法时遇到问题 现在我正在做 在我的 mainViewController 中 self customViewController UIStoryboard storybo
  • ContainerView 的 NSInvalidUnarchiveOperationException

    使用带有嵌入转场的容器视图 我得到这个 由于未捕获的异常 NSInvalidUnarchiveOperationException 而终止应用程序 原因 无法实例化名为 UIStoryboardEmbedSegueTemplate 的类 我
  • 我可以/如何确定设备是否有振动?

    我有一些设置可以启用 禁用某些操作的振动 但我发现如果设备没有振动能力 则显示它们毫无意义 有没有办法检查用户是否正在使用 iPod touch 以及它是否有振动 我不确定除了进行模型检查之外还有其他方法可以做到这一点 这可能不是一个很好的
  • Xcode 5 - clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)

    I am facing a linker error when running my source code I have attached a screenshot also I am new in iOS development and
  • UITextView自定义自动完成

    有没有办法为 UITextView 实现自定义自动完成 例如给它一个NSDictionary or NSArray需要注意的字符串 你必须自己编程 如果您实现 UITextViewDelegate 协议 则该函数 BOOL textView
  • iPhone OpenGL ES 工具中的 Tiler Utilization 统计数据意味着什么?

    我一直在尝试执行一些 OpenGL ES 性能优化 以提高 iPhone 应用程序中每秒渲染的三角形数量 但我遇到了困难 我尝试将 OpenGL ES 数据类型从固定点转换为浮点 每苹果的推荐 http developer apple co
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • 如何在iPhone应用程序中创建折线图? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 找出窗口中的 UIBarButtonItem 框架?

    UIBarButtonItem不延长UIView 所以没有像框架属性这样的东西 但有什么办法我可以得到它是什么CGRect框架 相对于应用程序UIWindow 你喜欢用吗私有API https stackoverflow com quest
  • 我们可以在 Objective-C 中创建可空/非空属性吗?

    我们可以在 Objective C 中创建可空 非空属性吗 如果可以 那么如何创建 您可以使用 Nullable and Nonnull预选赛 property copy nullable NSString name property co
  • Objective-C 2.0中的多线程问题

    我有我的主应用程序委托 其中包含一个返回对象的方法 该应用程序委托在主线程上运行 我还有一个在不同线程上运行的 NSOperation 除了希望有时能够在主线程上调用我的应用程序委托方法之外 我还需要从 NSOperation 线程中调用它

随机推荐