我有一个添加到UIViewController的UIView。
UIView是一个单独的类,单独的.h和.m文件。
我想呈现另一个UIViewController或其他东西。如何访问从UIView添加此UIView的UIViewController?
答案 0 :(得分:3)
简短回答:不,你不知道视图的视图控制器究竟是哪一个,因为这会打破MVC原则。
我认为你不明白MVC
的含义和意义。从另一个视图控制器的视图对象呈现视图控制器不是一个好方法。视图控制器应该提供来自外部世界的任何信息视图需求。
UIView
个对象仅用于显示屏幕上的UI组件,并负责正确绘制和布置其子视图。
正如我上面所说,你应该处理视图(或通信通道,无论你怎么称呼)之间的那种交互,总是在控制器中实际所属的位置。在此上下文中,您应该显示来自另一个视图控制器的任何视图控制器,而不是另一个视图。如果您需要将视图中的消息发送到其视图控制器,则可以使用delegate approach或NSNotificationCenter
类。
如果由我决定,当视图需要来自其视图控制器的一些信息时,我个人更喜欢使用委托。它比使用通知中心更容易理解,因为它可以更容易地跟踪信息流。但是在你的情况下,换句话说,视图控制器需要来自视图的信息(反向通信),我会去通知中心。
所以让我们用一个例子来丰富这个对话:
@implementation SomeView
- (IBAction)buttonClicked:(id)sender
{
NSDictionary *userInfo = @{@"value": [self someCalculatedValue]};
[[NSNotificationCenter defaultCenter] postNotificationName:ViewButtonClickedNotification object:self userInfo:userInfo];
}
@end
请注意,您永远不应将object:
方法的[NSNotificationCenter:postNotificationName:object]
参数保留为nil
,因为它可以帮助控制器区分其视图发送的通知与其他通知。
@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,以便了解它们的工作原理。