Interface Builder中的多个视图状态

时间:2011-02-25 13:19:30

标签: iphone interface-builder

我正在制作一个有3种状态的屏幕:

  • 验证
  • 装载
  • 错误

前两个非常简单,因为只有标签文本更改。第三个是棘手的,因为我需要显示一条错误消息,并在其上有一个重试按钮。

此外,我想将所有这些都放在一个控制器下(我猜这很容易。)

问题是:如何在Interface Builder中执行多个视图状态?有没有人这样做过?或者我是以错误的方式解决这个问题?

4 个答案:

答案 0 :(得分:4)

您可以尝试添加根据需要添加或删除的其他视图。在“文件所有者”,“第一响应者”,“查看”等窗口中,从库中添加三个UIView。您可能希望将其名称从“查看”更改为“验证”,“加载”和“错误”。

现在打开每个并通过添加按钮和标签以及其他类似的东西来自定义它。

返回XCode,声明新视图:

IBOutlet UIView *validView;
IBOutlet UIView *loadView;
IBOutlet UIView *errorView;

并确保在InterfaceBuilder中建立适当的连接。您希望从这些视图中链接的任何操作都应该很有效。

现在,切换,创建一个动作(或三个不同的动作)。这可以是IBAction或不是你喜欢的。在标题中:

-(void)showError;

现在要实现,你可能需要这样的东西。

-(void)showError {
  // skip this if you always arrive from the validView
  if ([validView superview]) {
    [validView removeFromSuperview];
  } 
  [self.view addSubview:errorView];
}

如果您愿意,可以通过动画获得更多动力:

    -(void)toggleErrorWithFlip {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationTransition:([errorView superview] ? UIViewAnimationTransitionFlipFromLeft : UIViewAnimationTransitionFlipFromRight) 
                           forView:[self view]
                             cache:YES];
    if ([errorView superview]) {
        [errorView removeFromSuperview];
    } else {
        [[self view] addSubview:errorView];
    }
    [UIView commitAnimations];
}

“重试”按钮可能会触发以下行的操作:

-(IBAction)retryLoad {
  [errorView removeFromSuperview];
  [self.view addSubview:validView];
  // do some stuff that retries whatever was tried and failed
}

同样,这可以在有或没有动画的情况下发生。

如果有一个默认视图,一个你总是重新开启的视图(例如validatingView),那么将其设为原始的“View”,然后在其上添加另外两个视图(例如loadView和errorView)。这可能会节省一些工作,具体取决于你想要的方式。

答案 1 :(得分:1)

您的错误似乎是UIAlertView

的理想选择
//wherever error is detected
UIAlertView *alert = [[UIAlert View alloc] initWithTitle:@"Error" message:@"An error occured" delegate:self cancelButtonTitle:@"Forget It" otherButtonTitles:@"Retry", nil];
[alert show];
[alert release];

//implement the delgate method
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated         {
  switch(buttonIndex) {
    case 0:
    break;
    case 1:
    break;
    default
    break;
  }
}

您还必须在标题中实现UIAlertViewDelegate!

答案 2 :(得分:1)

具体取决于所涉及的布局。我多次使用的最简单的方法是布置所有控件,并将它们的组标记为隐藏/不隐藏在以下方法中:

- (void) showErrorModeControls
{
    self.errorLabel.hidden = NO;
    self.errorButton.hidden = NO;
    self.regularLabel.hidden = YES;
    self.regularButton.hidden = YES;
}

你也可以做动画,淡入/淡出等等。这是一种方式。

另一种方法是将控件分组到主视图的子视图中,并将这些子视图显示/隐藏为整体。只有在您可以设置排列所有视图以便当多个可见时您可以看到其他视图的内容时,这才有效。您可以使用clearColor背景来实现这一目标。这种方法的优点是你可以在界面构建器中单独布置各个子视图中的控件(你用一个巧妙的技巧来做到这一点:只需将其他视图的帧的X坐标设置为320(或任何适合的视图)你想要编辑的视图“让它们脱离”。然后你完成后将它们移回X coord 0。

我使用的另一种方法是将整个“页面”视图像迷你导航控制器一样,并通过动画“屏幕上”和“屏幕外”框架来自行滑入和滑出这些视图。您可以在上面的界面构建器中使用相同的技巧来一次处理这些“页面”子视图。

答案 3 :(得分:0)

如果您需要自定义提醒,您实际上可以使用TSAlertView课程。它运行得非常好,并且易于部署。它看起来像一个UIAlertView,但你可以用UITextView,带有图例的多个按钮等来实际定制它。