【问题标题】:iOS Delegate Does Not Push or Present a ViewiOS 委托不推送或呈现视图
【发布时间】:2013-10-07 17:23:25
【问题描述】:

我有一个 HomeView 和一个 HomeDropDownView。

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

HomeView 是 HomeDropDownView 的代表。

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

如果我尝试从类中的 anywhere 启动 TestViewController,它可以正常工作 - 除了委托方法。

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

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

代码:

HomeDropDownView

- (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 或任何其他线程中找不到原因。 感谢您的帮助!

【问题讨论】:

  • HomeDropDownView 是模态视图控制器吗?如果是,即使您已经存在另一个模态视图,您也正在尝试显示模态视图。这是错误的。
  • 请不要使用 appdelegate 来呈现视图控制器,这是一种非常糟糕的做法。
  • Kedar:不,它是一个始终“存在”并且在显示/隐藏时调整大小的视图。
  • Jeremie:我实际上并没有使用 appdelegate。该代码留在那里以显示所有已尝试和失败的方法,以帮助某人帮助我找到解决方案。任何想到的解决方案?谢谢

标签: ios delegates presentmodalviewcontroller pushviewcontroller


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多