gpt4 book ai didi

ios - 如何获取从 subview 添加 subview 的 UIViewController?

转载 作者:行者123 更新时间:2023-11-28 19:52:19 24 4
gpt4 key购买 nike

我有一个添加到 UIViewController 的 UIView。

UIView 是一个单独的类和单独的 .h 和 .m 文件。

我想展示另一个 UIViewController 或其他东西。如何从 UIView 访问添加此 UIView 的 UIViewController?

最佳答案

简短回答:不,您无法确切地知道哪个是 View 的 View Controller ,因为那样会违反 MVC 原则。


我不认为你明白什么MVC意味着和代表。从另一个 View Controller 的 View 对象呈现 View Controller 不是一个好方法。 View Controller 应该提供来自外部世界的 View 所需的任何信息。

UIView 对象仅用于在屏幕上显示 UI 组件,并负责正确绘制和布局其 subview 。

正如我上面所说,您应该始终在 Controller 中处理 View (或沟通 channel ,无论您怎么调用它) 之间的那种交互。在这种情况下,您应该从另一个 view controller 而不是另一个 view 呈现任何 view controller。如果你需要从一个 View 发送消息到它的 View Controller ,你可以使用 delegate approachNSNotificationCenter类(class)。

如果由我决定,我个人更喜欢在 View 需要来自其 View Controller 的一些信息时使用委托(delegate)。它比使用通知中心更容易理解,因为它更容易跟踪信息流。但是,在您的情况下,换句话说, View Controller 需要来自 View 的信息(反向通信),我会选择通知中心。

那么让我们用一个例子来丰富这个对话:

@implementation SomeView

- (IBAction)buttonClicked:(id)sender
{
NSDictionary *userInfo = @{@"value": [self someCalculatedValue]};

[[NSNotificationCenter defaultCenter] postNotificationName:ViewButtonClickedNotification object:self userInfo:userInfo];
}
@end

请注意,永远不要将 [NSNotificationCenter:postNotificationName:object] 方法的 object: 参数保留为 nil,因为它会有所帮助 Controller 将其 View 发送的通知与其他通知区分开来。

@implementation SomeViewController

- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewButtonClicked:) name:ViewButtonClickedNotification object:self.view];
}

- (void)viewButtonClicked:(NSNotification *)
{
NSNumber *someCalculatedValue = notification.userInfo[@"value"];

[self presentViewController:[[UIViewController alloc] initWithCalculatedValue:someCalculatedValue] animated:YES completion:nil];
}
@end

有关 iOS 通信模式的更多信息,您可能想看看这个很棒的 article以便了解它们的工作原理。

关于ios - 如何获取从 subview 添加 subview 的 UIViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28513006/

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