1

我正在尝试制作像警报视图一样的自定义登录视图弹出窗口。我正在使用以下函数模拟 alertview 弹出窗口。这个函数在我的 loginViewController.m 的 viewDidload 中找到

-(void)initialDelayEnded {
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
    self.view.alpha = 1.0;
    [UIView animateWithDuration:1.0/1.5 animations:^{
        self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
    }completion:^(BOOL complete){
        [UIView animateWithDuration:1.0/2 animations:^{
            self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
        }completion:^(BOOL complete){
            [UIView animateWithDuration:1.0/2 animations:^{
                self.view.transform = CGAffineTransformIdentity;
            }];
        }];
    }];
}
- (void)viewDidLoad
{
    [self initialDelayEnded];
    [super viewDidLoad];
}

我正在通过以下方式在我的 firstViewController 中调用我的 loginViewController。

LoginViewController *login = [[LoginViewController alloc]initWithNibName:@"LoginViewController" bundle:NULL];
        [self presentViewController:login animated:YES completion:NULL];

但它因以下错误而崩溃。

'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x8674bf0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x8670620>> is associated with <LoginViewController: 0x868a7d0>. Clear this association before associating this view with <LoginViewController: 0x8451e70>.

有人可以帮助我吗?

提前致谢 !

4

5 回答 5

1

Here:

[self presentViewController:login animated:YES completion:NULL];

you are presenting a viewController by Self which i guess is a viewcontroller itself.

instead you should use:

[self presentModalViewController:login animated:YES];

if you want to present your viewcontroller rather pushing it on the navigation stack. In which class you are using this code.

于 2012-11-12T11:29:36.993 回答
0

除非您有特殊原因,否则请[super viewDidLoad];在您当地的实施范围内尽早致电完成。意思:打电话[self initialDelayEnded];之后[super viewDidLoad];

请确保您的 .xib 文件在面板LoginViewController中只有一个File's OwnerinPlaceholders并且没有 ViewController 对象。Objects并确保File's Owner自定义类是LoginViewController. 你能上传你的.xib的截图,具体显示Document Outline吗?找出可能出错的地方会容易得多

于 2012-11-12T12:37:43.987 回答
0

你检查过你的 LoginViewController xib 吗?您是否有可能将同一个视图与超过 1 个视图控制器进行映射?

于 2012-11-12T11:41:17.430 回答
0

我通过以下方式解决了我的应用程序登录问题>

  1. 使用 Alert View 在 applicationDidBecomeActive 上的 AppDelegate 中显示
  2. 将带有 XIB 的 UIView 控制器添加到名为 LoginSubView 的项目中。保持空白并添加标签说99
  3. 在警告框出现之前加载 LoginSubView 控制器。

    AFLoginViewController *LoginSubView = [[AFLoginViewController alloc] init];
    [_window addSubview:LoginSubView.view];
    [_window makeKeyAndVisible];
    
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login", nil];
    alert.alertViewStyle = UIAlertViewStyleSecureTextInput;
    [alert show];
    
  4. 如果登录成功,我在其他任何内容之前删除了 LoginSubView,并使用以下几行

    for (UIView *subView in _window.subviews)
    {
        if (subView.tag == 99)
        {
            [subView removeFromSuperview];
        }
    }
    
  5. 也可以在 applicationDidEnterBackground 上添加相同的子视图。避免下次回到前台时闪烁敏感的屏幕视图

于 2013-04-08T10:16:17.740 回答
0

错误消息暗示有两个“LogInViewController”实例。你在使用故事板吗?如果是这样,您可以将视图控制器添加到主故事板文件(而不是单独的 nib),给它一个标签/标识符(但不要将它连接到其他 VC)。然后,您可以获取故事板创建的实例并呈现它。像这样:

//Get the stroyboard
UIStoryBoard *mainStoryBoard = [UIStoryBoard storyboardWithName:<STORYBOARD_NAME> bundle:nil];

//Get the VC
LogInViewController *login = [mainStoryBoard instantiateViewControllerWithIdentifier:<VIEWCONTROLLER_TAG>];

//Present
[self presentModalViewController:login animated:YES];

此外,您不应该尝试在 中显示其他视图控制器viewDidLoad:,它不会起作用。移动代码以显示新控制器viewDidAppear:

于 2012-11-12T12:43:47.927 回答