3

这是我的问题:

我有一个UIViewController嵌入在NavigationController. 它也是RootViewController应用程序的。从那里,我有一个 push segue 到 normalUIViewController和第二个 push segue 到一个UITableViewController带有它自己UIViewController的详细视图。

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

现在用户已经指定了所有内容,我希望他按下“发送”按钮。该按钮必须做两件事:弹回根视图并通过协议类实例发送用户定义的消息。我可以很好地完成弹回:

[self.navigationController popToRootViewControllerAnimated:true];

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

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

如果你知道如何做以上两个中的一个,请帮我一把!

干杯。

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

4

5 回答 5

4

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

[self.view.window.rootviewcontroller doSomething];

第二种选择是在你的 appDelegate 上定义一个属性:

@property (nonatomic, strong) UIViewController *root;

并通过以下方式调用它:

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

[appDelegate.root doSomething];
于 2013-09-10T07:31:53.487 回答
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;
    }

}

根视图控制器.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;
    }

}

视图控制器.m

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

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

UITableViewController.m

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

[self.root displayMessage:message];

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

于 2013-09-10T08:06:07.167 回答
1

你可以试试:

UIApplication *myApp = [UIApplication sharedApplication];
UIWindow *frontWindow = [myApp.windows lastObject];
UIViewController *myRootViewController = frontWindow.rootViewController;
于 2013-09-10T07:37:54.130 回答
1

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

于 2013-09-10T07:31:58.393 回答
1

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

通过添加观察者。

于 2013-09-10T08:04:55.713 回答