如何获得从子视图添加子视图的UIViewController?

时间:2015-02-14 06:10:49

标签: ios objective-c

我有一个添加到UIViewController的UIView。

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

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

1 个答案:

答案 0 :(得分:3)

简短回答:不,你不知道视图的视图控制器究竟是哪一个,因为这会打破MVC原则。


我认为你不明白MVC的含义和意义。从另一个视图控制器的视图对象呈现视图控制器不是一个好方法。视图控制器应该提供来自外部世界的任何信息视图需求。

UIView个对象仅用于显示屏幕上的UI组件,并负责正确绘制和布置其子视图。

正如我上面所说,你应该处理视图(或通信通道,无论你怎么称呼)之间的那种交互,总是在控制器中实际所属的位置。在此上下文中,您应该显示来自另一个视图控制器的任何视图控制器,而不是另一个视图。如果您需要将视图中的消息发送到其视图控制器,则可以使用delegate approachNSNotificationCenter类。

如果由我决定,当视图需要来自其视图控制器的一些信息时,我个人更喜欢使用委托。它比使用通知中心更容易理解,因为它可以更容易地跟踪信息流。但是在你的情况下,换句话说,视图控制器需要来自视图的信息(反向通信),我会去通知中心。

所以让我们用一个例子来丰富这个对话:

@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,以便了解它们的工作原理。