如何将数据发送到RootViewController

时间:2013-09-10 07:10:03

标签: iphone ios xcode

这是我的问题:

我有一个UIViewController嵌入NavigationController的基本应用程序。它也是应用程序的RootViewController。从那里我有一个普通的UIViewController推送segue和第二个推送到一个UITableViewController的segue,它有自己的UIViewController用于详细视图。

在根视图中,有一个类的实例,其目的是使用define协议发送消息。 在表格视图中,用户将选择他想要发送的消息类型,并在详细视图中选择该特定类型消息的内容。

现在用户已经指定了所有内容,我希望他按下“发送”按钮。该按钮必须执行两项操作:弹出回根视图并通过协议类实例发送用户定义的消息。 我可以用以下方式做回弹:

[self.navigationController popToRootViewControllerAnimated:true];

但我不知道如何将消息(类实例)发送回根视图。该应用程序仍然是新鲜的,所以如果这个不正确,我可以完全改变结构。

对我来说最好的是从任何地方访问协议类实例(我将在另一个UIViewController中使用它)但我不知道如何做到这一点,这就是为什么我想要发回消息到根视图。

如果你知道怎么做以上两种中的一种,请帮我一把!

干杯。

编辑:从技术上讲,NavigationController是最初的ViewController所以我不确定谁是RootViewController

5 个答案:

答案 0 :(得分:4)

首先:您可以这样做:(仅当您的视图已添加到窗口时才有效)

[self.view.window.rootviewcontroller doSomething];

第二个选项是在appDelegate上定义一个属性:

@property (nonatomic, strong) UIViewController *root;

并通过以下方式致电:

AppDelegate *appDelegate= (YourAppDelegateClass *) [[UIApplication sharedApplication] delegate];

[appDelegate.root doSomething];

答案 1 :(得分:1)

您可以创建一个应用程序对象并将消息分配给它。并在根视图控制器上使用它。如果我理解你的问题,这可能会有所帮助。

答案 2 :(得分:1)

你可以尝试:

UIApplication *myApp = [UIApplication sharedApplication];
UIWindow *frontWindow = [myApp.windows lastObject];
UIViewController *myRootViewController = frontWindow.rootViewController;

答案 3 :(得分:1)

您还可以在移动到根视图控制器时发送通知

通过添加观察者。

答案 4 :(得分:1)

一种方法是使用协议,其他方法是使用自定义init方法将根视图控制器实例传递给tableviewcontroller(通过视图控制器),如:

<强> UIViewController.m

- (id)initWithRoot:(id)rootInstance
      withNibNameOrNil:(NSString *)nibNameOrNil
                bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        self.root = (RootView *)rootInstance;
    }

}

<强> RootViewController.m

viewcontrollerInstance = [[viewcontroller alloc] initWithRoot:self                      withNibNameOrNil:@"viewcontroller"
bundle:[NSBundle mainBundle]];

[self.navigationController pushViewController:viewcontrollerInstance animated:YES];

<强> UITableViewController.m

- (id)initWithRoot:(id)rootInstance
      withNibNameOrNil:(NSString *)nibNameOrNil
                bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        self.root = (RootView *)rootInstance;
    }

}

<强> ViewController.m

tableViewInstance = [[tablecontroller alloc] initWithRoot:self                      withNibNameOrNil:@"tablecontroller"
bundle:[NSBundle mainBundle]];

[self.navigationController pushViewController:tableViewInstance animated:YES];

<强> UITableViewController.m

现在在表视图控制器上使用你的根实例(来自视图控制器)来调用根视图控制器的功能,如:

[self.root displayMessage:message];

抱歉打字错误。希望这会有所帮助。