0

我有一个 HomeView 和一个 HomeDropDownView。

HomeDropDownView 显示为 HomeView 上方的下拉视图。

HomeView 是 HomeDropDownView 的代表。

当我在 HomeDropDownView 中执行操作时,我想在 HomeView 中调用委托方法并让该委托方法呈现第三个视图控制器,即来自其导航控制器的 TestViewController。

如果我尝试从类中的任何位置启动 TestViewController ,它工作正常 - 除了委托方法。

HomeDropDownView 中有动画,但在编译中调用委托方法不会使视图控制器出现。在我使用这个动画的情况下,无论如何都不会触发;只有没有动画的调整大小。

TestViewController 的 init 和 viewDidLoad 一样被调用,但没有 viewWillAppear 并且视图不会出现。

代码:

主页下拉查看

- (void)finalAction {
    ...
    [self callDelegateAction];
    ...

- (void)calldelegateAction {
    if ([self.delegate respondsToSelector:@selector(launchTestView)] ) {
        [self.delegate launchTestView];
    } else {
        DLog(@"Error out to the user.");
    }
}

主页查看

- (void)launchTestView {
        //[self listSubviewsOfView:self.parentViewController.view];

        NSLog(@"delegate method | self: %@", self);

        TestViewController *tvc = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
        //[self.navigationController presentViewController:tvc animated:YES completion:nil];
        //[self.view.window.rootViewController presentViewController:tvc animated:YES completion:nil];
        //[self.navigationController pushViewController:tvc animated:YES];
        AppDelegate *appdelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        [appdelegate.tabBarController.navigationController presentViewController:tvc animated:YES completion:^() {
            NSLog(@"Done!");
        }];
}

上述方法均无效。但是,如果我将完全相同的代码放入 viewDidAppear 或将其放入按钮操作方法中,它将正常工作。在调用委托方法的时候 self 是 HomeView 并且所有的子视图,包括导航控制器似乎都在那里。这是在一个基于 tabcontroller 的项目中,但我认为上述任何一种方式仍然是调用导航控制器的可接受方式。

我错过了什么?为什么我的委托方法不想在 HomeView 的导航控制器上推送/呈现视图控制器?这可能是我缺少的东西,但我在 Apple Docs 或任何其他线程中找不到原因。谢谢您的帮助!

4

1 回答 1

0

可悲的是,事实证明 HomeView 在消息执行期间被更改。因此,当 HomeView 收到消息调用时,它不再是最初请求操作的同一个 HomeView 对象。所以不是同一个代表。这样做是为了让用户觉得同一个视图被用于不同的事情。但这是一个很好的例子,说明了为什么你不应该破坏和重新创建批判性视图。如果我们知道我们将发送消息,我们应该使用相同的视图并重新加载对象。或者有一些控制结构的概念。

于 2013-10-17T12:05:35.790 回答