在iphone中的几个视图之间导航

时间:2012-01-13 12:50:09

标签: iphone navigation views

您好我有三个观点,我想实现一些不起作用的东西。我有一个主视图,如果用户按下某个按钮,代码会检查他是否被记录: 如果是,他会直接发送到视图B,如果不是他首先进入登录视图。 成功登录后,我有这个代码去查看b:

incidencias =[[MisIncidencias alloc]
              initWithNibName:@"MisIncidencias"
              bundle:nil];

[self.view addSubview:incidencias.view];

问题是我想摆脱登录视图,因为它显示在下面加上如果用户点击它返回登录但是如果我添加:

[self.view removeFromSuperview];

[self.view addSubview:incidencias.view]之前或之后,我只是被重定向到主视图;

我不知道我是否清楚地解释了自己但是例如在Android中你可以打电话给完成然后调用下一个活动然后登录活动消失但是在iphone中我不知道该怎么做。

我发现另一个解决方案是一个接一个地添加两个视图,但它并没有真正起作用:

incidencias=[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil
                  ];

    [self.view addSubview:incidencias.view];

    login=[[LoginViewController alloc]
                  initWithNibName:@"LoginViewController"
                  bundle:nil];
    [self.view addSubview:login.view];

它不能很好地工作,因为incidencias启动并且不等待登录完成。

感谢

编辑:感谢beOn我修改了添加协议的代码: LoginViewControllerDelegate 和viewController中的这个方法:

- (void)loginSucceededFromController:(LoginViewController*)viewController {
[viewController.view removeFromSuperview];

incidencias =[[MisIncidencias alloc]
              initWithNibName:@"MisIncidencias"
              bundle:nil];

[self.view addSubview:incidencias.view];
}
在LoginViewController中

我有

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:  (NSInteger)buttonIndex{

if(self.delegate)
    [self.delegate loginSucceededFromController:self]

} 它得到一个错误: 语义问题:在'LoginViewController *'

类型的对象上找不到属性'委托'

如果登录成功,用户会看到警报,一旦他点击确定,就会调用上述方法。

我还应该添加什么?我开始使用iphone而且我不太了解什么是委托(我来自java)

3 个答案:

答案 0 :(得分:1)

啊,好吧,这并不是那么糟糕。这是我想到的第一个解决方案:

步骤1.为登录视图创建委托协议。

@protocol LoginViewControllerDelegate <NSObject>
@required
- (void)loginSucceededFromController:(LoginViewController*)viewController;
@end

步骤2.在主视图控制器中实施协议

- (void)loginSucceededFromController:(LoginViewController*)viewController {
// TODO: we'll put something here in a second
}

步骤3.成功登录后,从登录视图中调用委托方法

if (loginSuccess && self.delegate) {
    [self.delegate loginSucceededFromController:self]
}

步骤4.关闭登录视图并使用您已有的代码从主视图控制器显示新视图:

- (void)loginSucceededFromController:(LoginViewController*)viewController {
    [viewController.view removeFromSuperview];

    incidencias =[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil];

    [self.view addSubview:incidencias.view];
}

希望能够解决一些问题。您遇到问题的原因是您要么在视图中添加子视图,然后立即删除视图,要么删除视图,然后向其添加子视图。在上面的代码中,您调用视图的控制器的委托,并且恰好拥有视图的超级视图的委托首先删除视图,然后向superview添加newView(缺少更好的术语)。由于超级视图从未被删除,因此它可以显示您的新视图。

答案 1 :(得分:0)

你必须采取BOOL,可以通过全局

这样的应用程序访问 一旦您登录设置为extern BOOL login;

就像YES一样。现在检查

if(login == YES){

incidencias=[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil
                  ];

    [self.view addSubview:incidencias.view];

}
else{
login=[[LoginViewController alloc]
                  initWithNibName:@"LoginViewController"
                  bundle:nil];
    [self.view addSubview:login.view];
}

答案 2 :(得分:0)

如果你想要一些正常工作的东西,并且你正在使用uinavigationcontroller ...那么你可以使用

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

只需获取self.navigationController.viewcontrollers数组的可变副本,弹出最后一个元素,这将是登录屏幕并按下您计划移动的新屏幕 screen b ..并将数组传递给这个函数..你现在安全了!