我使用以下代码添加了一个子视图控制器:
MyCustomViewController * overlayView = [[MyCustomViewController alloc] initWithNibName:@"MyCustom" bundle:nil];
UIViewController *parentViewController = self.tabBarController;
[modalView willMoveToParentViewController:parentViewController];
// set the frame for the overlayView
overlayView.view.frame = parentViewController.view.frame;
[parentViewController.view addSubview: overlayView.view];
[parentViewController.view needsUpdateConstraints];
[parentViewController.view layoutIfNeeded];
// Finish adding the overlayView as a Child View Controller
[parentViewController addChildViewController: overlayView];
[overlayView didMoveToParentViewController:parentViewController];
然后在
MyCustomViewController
中,点击按钮即可触发要显示的模式视图:MyModalViewController *vc = [[MyModalViewController alloc] initWithNibName:@"DirectEmployerSignup" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc];
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(closeTheModal:)];
vc.navigationItem.leftBarButtonItem = button;
[self.navigationController presentViewController:navigationController animated:YES completion:nil];
点击
UIBarButtonItem
会触发closeTheModal:
- (void)closeTheModal:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
模式关闭后,
MyCustomViewController
仍然可见,但是视图停止按预期进行反应。 UITextViews
上的MyCustomViewController
不会在MyCustomViewController.m
等中触发其委托方法。为了清楚起见:,我仍然可以点击
UITextFields
上的MyCustomViewController
,并且仍然可以看到按钮在我点击时做出反应,但是它们并未触发相关的IBActions
等。任何关于正在发生的事情的想法将不胜感激。
附加信息
我在
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
中使用MyModalViewController
添加了一种关闭模式的方法,并将action:@selector()
指向该方法。MyModalViewController
中的方法将触发并关闭模式,但MyCustomViewController
仍然没有响应。po [[[[[UIApplication sharedApplication] keyWindow] rootViewController] _printHierarchy]
当我运行
po [[[[UIApplication sharedApplication] keyWindow] rootViewController] _printHierarchy]
时,在显示“模态”视图之前,我看到以下内容:<UINavigationController 0x7fc23985b200>, state: appeared, view: <UILayoutContainerView 0x7fc238f3b760>
| <MyTabBarController 0x7fc23a045400>, state: appeared, view: <UILayoutContainerView 0x7fc238cc7500>
| | <MyNavigationController 0x7fc23985a800>, state: appeared, view: <UILayoutContainerView 0x7fc23b0497e0>
| | | <FirstTabViewController 0x7fc238d47650>, state: appeared, view: <UIView 0x7fc23b1318a0>
| | <UINavigationController 0x7fc23a0bc000>, state: disappeared, view: (view not loaded)
| | | <SecondTabViewController 0x7fc238c8da90>, state: disappeared, view: (view not loaded)
| | <UINavigationController 0x7fc23987c800>, state: disappeared, view: (view not loaded)
| | | <ThirdTabViewController 0x7fc238f77c00>, state: disappeared, view: (view not loaded)
| | <MyCustomViewController 0x7fc238d48e50>, state: appearing, view: <UIView 0x7fc23b086220>
但是...我解散了模态并重新运行
po [[[[UIApplication sharedApplication] keyWindow] rootViewController] _printHierarchy]
之后,<MyCustomViewController 0x7fc238d48e50>
丢失了。也许问题出在
<MyCustomViewController>
说“出现”而不是“出现”这一事实?我的解决方案
我从更改了
MyCustomViewController
UIViewController *parentViewController = self.tabBarController;
至
UIViewController *parentViewController = self.tabBarController.navigationController;
感谢所有提供帮助的人。我将复查您的答案,希望下次可以更好地实现此效果。
最佳答案
该问题是由于您的MyCustomViewController
从其父控制器中删除而引起的。您的 Activity 将停止发送。
从您发布的代码中,我无法说出删除了控制器的原因,但是您应该可以使用-[MyCustomViewController removeFromParentViewController]:
中的断点很容易地调试它。您可能是错误地显式删除了它,还是UITabBarController
本身将其删除了(可能是由问题引起的)如下面所描述的)。
但是,还有另一个大问题:UITabBarController
是一个容器控制器。控制器的重点是管理其子视图控制器。这也意味着控制器正在管理哪个控制器正在接收外观回调(例如viewWillAppear:
,viewDidAppear:
等)。通过添加另一个子视图控制器,您正在执行不支持的操作。
例如,当UITabBarController
出现时,它仅将viewDidAppear:
发送到其选定的控制器。它不会将viewDidAppear:
发送到您的其他控制器。
这可能导致许多非常成问题的状态,我认为这是您问题的根源。
您可以考虑以下层次结构(为标签栏控制器和您的自定义控制器引入 public 父级),而不是直接将子控制器添加到UITabBarController
中。
UIViewController
| UITabBarController
| MyCustomViewController