Interface Builder 中的多个视图状态

cha*_*log 4 iphone interface-builder

我正在处理一个有 3 种状态的屏幕:

  • 证实
  • 加载中
  • 错误

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

另外,我希望将所有这些都放在一个控制器下(我想这是最简单的部分。)

问题是:如何在 Interface Builder 中执行多个视图状态?以前有人这样做过吗?或者我以错误的方式处理这件事?

Pen*_*One 5

您可以尝试添加根据需要添加或删除的其他视图。在带有“文件所有者”、“第一响应者”、“视图”等的窗口中,从库中添加三个 UIView。您可能需要将它们的名称从“View”更改为“Validating”、“Loading”和“Error”。

现在打开每一个,并通过添加按钮、标签和其他类似的东西来根据需要对其进行自定义。

返回 XCode,声明新视图:

IBOutlet UIView *validView;
IBOutlet UIView *loadView;
IBOutlet UIView *errorView;
Run Code Online (Sandbox Code Playgroud)

并确保在 InterfaceBuilder 中进行适当的连接。您希望从这些视图中的任何一个链接起来的任何操作都应该效果很好。

现在,要进行切换,请创建一个操作(或三个不同的操作)。这可以是 IBAction,也可以不是,如您所愿。在标题中:

-(void)showError;
Run Code Online (Sandbox Code Playgroud)

现在对于实现,您可能需要这样的东西。

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

如果您愿意,您可以对动画更加感兴趣:

    -(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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

同样,无论有没有动画,这种情况都可能发生。

如果有一个默认视图,您总是依赖它(例如 validatingView),则将其设为原始“视图”,然后在其顶部添加其他两个视图(例如 loadView 和 errorView)。这可能会节省一些工作,具体取决于您希望事情如何进行。