gpt4 book ai didi

iphone - subview Controller 如何使用Parentviewcontroller中定义的方法

转载 作者:行者123 更新时间:2023-12-03 19:30:27 27 4
gpt4 key购买 nike

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

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

谢谢

最佳答案

您可以使用 parentViewController 属性访问 View Controller 的父级。

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

[viewController foo];
}

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

说明:

对于 UIViewController 上的 parentViewControllerpresentingViewController 属性之间的差异似乎存在一些混淆。有两种不同的 View Controller 关系,每种关系都适用于这些属性之一。

如果您希望将多个 View Controller 的 View 添加为父 View Controller 的 subview ,请使用 view controller containment 。在这种情况下,当 parentViewController 属性为已访问。在这种情况下,presentingViewController 属性返回 null

例如,在父 View Controller 中:

- (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);
}

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

例如,在呈现 View Controller 中:

- (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);
}

虽然由于 iOS 中模态视图 Controller 模式的盛行,presentingViewController 可能更常见,但 View Controller 的 View Controller 包含父子关系是绝对合法的,并且 自 iOS 5 起,UIViewController 的 ParentViewControllerchildViewController 属性尚未被弃用,它们的用途只是发生了变化。您可以阅读文档中的这段摘录:

Discussion

If the recipient is a child of a container view controller, this property holds the view controller it is contained in. If the recipient has no parent, the value in this property is nil.

Prior to iOS 5.0, if a view did not have a parent view controller and was being presented, the presenting view controller would be returned. On iOS 5, this behavior no longer occurs. Instead, use the presentingViewController property to access the presenting view controller.

关于iphone - subview Controller 如何使用Parentviewcontroller中定义的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14298258/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com