【问题标题】:Navigating between several views in iphone在 iphone 中的多个视图之间导航
【发布时间】:2012-01-13 12:50:09
【问题描述】:

您好,我有三种观点,我想实现一些不起作用的东西。如果用户按下某个按钮,我有一个主视图,代码会检查他是否已登录: 如果是,则直接将他发送到视图 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];

它不能很好地工作,因为事件开始并且不等待登录完成。

谢谢

编辑:感谢 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开始的,不太明白什么是delegate(我来自java)

【问题讨论】:

  • 查看我对您对我的回复 fmi 的回复...

标签: iphone navigation views


【解决方案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];
}

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

【讨论】:

  • beOn 非常感谢您的分析器,但我无法让它工作。我一直在阅读有关协议的内容,但找不到其他内容。我已经更新了我上面的问题,以解释我在哪里得到错误。
  • 有关如何设置和使用委托属性的说明,请参阅我对此问题的回答。问题是关于其他的,但我描述的设置将解决您的问题:stackoverflow.com/a/8851420/152236
  • 我没有提到的一件事是您必须自己设置委托属性。所以从你的主视图控制器,你会做: login.delegate = self.这样,登录 viewController 就知道它的委托对象是什么对象,因此它知道将消息发送到哪里。您收到该错误是因为 LoginViewController.h 没有定义名为“delegate”的属性。
  • 非常感谢,我终于理解了整个委托系统
【解决方案2】:

你必须采取 BOOL 可以通过全局等应用程序访问的

现在一旦登录设置为YES,就喜欢extern BOOL login;。现在检查何时

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];
}

【讨论】:

  • 我认为他已经能够做到这部分。他遇到的问题是成功登录后屏幕上出现了一个 MisIncidencias 实例。
【解决方案3】:

如果您想要立即工作,并且您正在使用 uinavigationcontroller... 那么您可以使用

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

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

【讨论】:

  • 这里似乎没有使用 UINavigationController,但是是的,如果有,这将是一种方法。
猜你喜欢
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多