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

在iphone中的多个视图之间导航,iphone,navigation,views,Iphone,Navigation,Views,嗨,我有三个观点,我想实现一些不可行的东西。我有一个主视图,如果用户按下某个按钮,代码将检查他是否已登录: 如果是,则直接将其发送到视图B;如果不是,则首先转到登录视图。 成功登录后,我将使用此代码转到视图b: incidencias =[[MisIncidencias alloc] initWithNibName:@"MisIncidencias" bundle:nil]; [self.view addSubview:incidenci

嗨,我有三个观点,我想实现一些不可行的东西。我有一个主视图,如果用户按下某个按钮,代码将检查他是否已登录: 如果是,则直接将其发送到视图B;如果不是,则首先转到登录视图。 成功登录后,我将使用此代码转到视图b:

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

[self.view addSubview:incidencias.view];
问题是,我想摆脱登录视图,因为它显示在下面,如果用户单击“上一步”,它将返回登录,但如果我添加:

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

我不知道我是否解释得很清楚,但例如在Android中,你只需调用finish,然后调用next activity,登录活动就会消失,但在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,我修改了代码,添加了协议: LoginView控制器远程门 在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*”类型的对象上找不到属性“delegate”

如果登录成功,用户会看到一个警报,一旦他单击ok,就会调用上面的方法


我还应该补充什么?我是从iphone开始的,我不太明白什么是委托(我来自java)

你必须了解哪些人可以通过像global这样的应用程序访问

extern BOOL登录
登录后立即设置为
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];
}

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

第一步。为您的登录视图创建代理协议

@protocol LoginViewControllerDelegate <NSObject>
@required
- (void)loginSucceededFromController:(LoginViewController*)viewController;
@end
第三步。成功登录时,从登录视图调用委托方法

if (loginSuccess && self.delegate) {
    [self.delegate loginSucceededFromController:self]
}
第四步。关闭登录视图,并使用您已有的代码从主视图控制器显示新视图:

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

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

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

希望这能澄清一些问题。出现问题的原因是,您要么向视图添加子视图,然后立即删除该视图,要么删除该视图,然后向其添加子视图。在上面的代码中,您调用视图的控制器的委托,该委托(碰巧拥有该视图的superview)首先删除该视图,然后向superview添加一个新视图(缺少更好的术语)。由于superview从未被删除,因此它能够显示您的新视图。

如果您希望立即运行某些功能,并且您正在使用uinavigationcontroller。。。那么你就可以利用

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

只需获取self.navigationController.viewcontrollers数组的可变副本,弹出最后一个元素,即登录屏幕,并将其推入计划移动屏幕b的新屏幕。。并将数组传递给此函数。。你现在安全了

我想他已经可以做这部分了。他遇到的问题是,在成功登录后,屏幕上出现了一个误报实例。这里似乎没有使用UINavigationController,但是的,如果有,这是一种方法。beOn非常感谢您的回复,但我无法让它工作。我一直在读关于协议的书,但我找不到还有什么遗漏。我已将上面的问题更新为Exaplane,以了解我在哪里遇到错误。有关如何设置和使用委托属性的说明,请参阅我对此问题的回答。问题是关于其他方面的,但是我描述的设置将解决您的问题:我没有提到的一点是,您必须自己设置委托属性。因此,在主视图控制器中,您可以执行以下操作:login.delegate=self。这样,登录viewController就知道什么对象是它的委托,所以它知道在哪里发送消息。您之所以会出现此错误,是因为LoginViewController.h未定义名为“delegate”的属性。非常感谢我终于能够理解整个委托系统查看我对您对我的响应的响应。。。
- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated