这是我的问题:
我有一个UIViewController
嵌入NavigationController
的基本应用程序。它也是应用程序的RootViewController
。从那里我有一个普通的UIViewController
推送segue和第二个推送到一个UITableViewController
的segue,它有自己的UIViewController
用于详细视图。
在根视图中,有一个类的实例,其目的是使用define协议发送消息。 在表格视图中,用户将选择他想要发送的消息类型,并在详细视图中选择该特定类型消息的内容。
现在用户已经指定了所有内容,我希望他按下“发送”按钮。该按钮必须执行两项操作:弹出回根视图并通过协议类实例发送用户定义的消息。 我可以用以下方式做回弹:
[self.navigationController popToRootViewControllerAnimated:true];
但我不知道如何将消息(类实例)发送回根视图。该应用程序仍然是新鲜的,所以如果这个不正确,我可以完全改变结构。
对我来说最好的是从任何地方访问协议类实例(我将在另一个UIViewController
中使用它)但我不知道如何做到这一点,这就是为什么我想要发回消息到根视图。
如果你知道怎么做以上两种中的一种,请帮我一把!
干杯。
编辑:从技术上讲,NavigationController
是最初的ViewController
所以我不确定谁是RootViewController
。
答案 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];
抱歉打字错误。希望这会有所帮助。