MyCustomViewController

MyCustomViewController

我使用以下代码添加了一个子视图控制器:

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>说“出现”而不是“出现”这一事实?

我的解决方案
我从更改了MyCustomViewControllerUIViewController *parentViewController = self.tabBarController;

UIViewController *parentViewController = self.tabBarController.navigationController;
感谢所有提供帮助的人。我将复查您的答案,希望下次可以更好地实现此效果。

最佳答案

该问题是由于您的MyCustomViewController从其父控制器中删除而引起的。您的 Activity 将停止发送。

从您发布的代码中,我无法说出删除了控制器的原因,但是您应该可以使用-[MyCustomViewController removeFromParentViewController]:中的断点很容易地调试它。您可能是错误地显式删除了它,还是UITabBarController本身将其删除了(可能是由问题引起的)如下面所描述的)。

但是,还有另一个大问题:
UITabBarController是一个容器控制器。控制器的重点是管理其子视图控制器。这也意味着控制器正在管理哪个控制器正在接收外观回调(例如viewWillAppear:viewDidAppear:等)。通过添加另一个子视图控制器,您正在执行不支持的操作。

例如,当UITabBarController出现时,它仅将viewDidAppear:发送到其选定的控制器。它不会将viewDidAppear:发送到您的其他控制器。

这可能导致许多非常成问题的状态,我认为这是您问题的根源。

您可以考虑以下层次结构(为标签栏控制器和您的自定义控制器引入 public 父级),而不是直接将子控制器添加到UITabBarController中。

UIViewController
   |  UITabBarController
   |  MyCustomViewController

08-25 23:04