【问题标题】:Why modal presentation is empty为什么模态演示是空的
【发布时间】:2012-12-17 23:23:54
【问题描述】:

我有两个视图控制器。在第一个中,我有一个按钮,当单击它时,我想在屏幕右侧显示另一个视图控制器,以便像模态呈现表单一样登录。

目前我有第二个带有标签的视图控制器,但是当我单击它时它显示为空,我不知道怎么做,因为我在里面放了一个标签,当然在屏幕中间。

LoginViewController *loginController = [[LoginViewController alloc] init];
loginController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:loginController animated:YES completion:nil];
loginController.view.superview.frame = CGRectMake(0, 0, 300, 1000);
loginController.view.superview.center = self.view.center;

有什么看标签的建议吗?换个位置?

【问题讨论】:

  • 尝试使用initWithNibName:@"MyNibName"] 进行LoginViewController 初始化。它可能正在创建UIViewController 的新实例,因为它没有链接到您的 nib 文件..
  • 我将此视图控制器的标题和情节提要 ID 命名为 LoginViewController,然后我将代码更改为 LoginViewController *loginController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil] ;但是由于未捕获的异常'NSInternalInconsistencyException'而出现异常终止应用程序,原因:'Could not load NIB in bundle:
  • 代替nil,试试[NSBundle mainBundle],看看是否可行。
  • stackoverflow.com/a/8853872/1523962 。使用 UIStoryboard 实例方法instantiateViewControllerWithIdentifier:
  • 您是否在 LoginViewController 类中明确设置了视图的超级视图?还是其他地方?否则,您不应尝试更改其属性。由于您添加了新的视图控制器,因此新视图将与您的其他视图不在同一视图层次结构中。

标签: ios view controller uimodalpresentationformsh


【解决方案1】:

我认为最好使用自定义容器控制器方法来执行此操作。在下面的示例代码中,我制作了一个表单大小 (540 x 600) 的登录控制器,并将其从右侧滑入 ViewController 的主视图,使其垂直居中,并靠在右边。

在 ViewController.m 中,我有这个:

-(IBAction)showLogin:(id)sender {
    LoginController *login = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
    login.view.frame = CGRectMake(768, 202, 540, 600);//centered vertically and offscreen to the right
    [self addChildViewController:login];
    [self.view addSubview:login.view];
    [UIView animateWithDuration:.5 animations:^{
        login.view.frame = CGRectMake(228, 202, 540, 600);
    } completion:^(BOOL finished) {
        [login didMoveToParentViewController:self];
    }];
}

为了移除视图,我在 LoginController.m 中有这个:

-(IBAction)goBackToMain:(id)sender {
    [UIView animateWithDuration:.5 animations:^{
        self.view.frame = CGRectMake(768, 202, 540, 600);
    } completion:^(BOOL finished) {
        [self.view removeFromSuperview];
        [self removeFromParentViewController];
    }];
}

编辑后:

如果你想从 ViewController 中的按钮中删除登录控制器,你可以这样做:

-(IBAction)goBackToMain:(id)sender {
        LoginController *login = self.childViewControllers.lastObject;
        [UIView animateWithDuration:.5 animations:^{
            login.view.frame = CGRectMake(768, 202, 540, 600);
        } completion:^(BOOL finished) {
            [login.view removeFromSuperview];
            [login removeFromParentViewController];
        }];
    }

【讨论】:

  • 太棒了!这个更好! :) 如果我单击父控制器,我想删除登录视图,所以我必须将 goBackToMain 放在 ViewController 中,不是吗?
  • @Anna 是的,您可以将该代码移动到 ViewController -- 您可以使用 self.childViewControllers.lastObject 引用登录控制器
  • 谢谢。但是如果在父视图控制器中按下,我希望执行 goBackToMain 方法。如果我有一个特定的按钮,我知道该怎么做,但不是在所有区域。我不知道我是否解释正确。子视图出现在右侧,所以如果我单击左侧,我想删除子视图控制器。那么我要做什么这个动作呢?将几乎透明的图像放在左侧以捕捉点击按钮...
  • 我编辑了我的答案以展示如何从 ViewController 使用 goBackToMain。您是在问,还是在问如何让一个按钮同时显示和删除登录控制器?
  • 我的问题是,当我不仅在特定按钮中单击父区域时,是否可以执行 goBackToMain 操作。
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多