【问题标题】:Can I use one viewController instead of 5?我可以使用一个 viewController 而不是 5 个吗?
【发布时间】:2012-12-12 18:17:58
【问题描述】:

我希望用户输入 5 个关于他自己的详细信息,但我不想使用无聊的 5 个文本字段表单。我希望用户一次看到一个文本字段-> 单击按钮并移动到下一个文本字段。 我的问题是,我必须为此使用 5 个视图控制器吗?我正在尝试寻找一种更优雅的方式。

我为每个使用过的文本字段考虑了类似 setHidden:YES 的东西,但它没有动画并且看起来有点难看,所以我正在寻找替代方案。

【问题讨论】:

  • 您可以使用 UIScrollView 并将分页设置为启用
  • 您可以使用非常简单的动画。检查我的答案stackoverflow.com/a/11934604/1032151
  • 为什么需要 5 个不同的文本字段?使用显示要插入的详细信息标题的标签,然后当用户插入它时,只需更改标签的标题并使用相同的文本字段。
  • 您确定要这样设计您的应用程序吗?询问在网页中浏览过“幻灯片放映”的任何人的感受。
  • @trudyscousin 我认为 1 2 3 步比提前看到 3 步要好一些。这只是名字、年龄等。

标签: objective-c ios


【解决方案1】:

我认为你应该只使用一个UIViewController(DetailViewController)和一个UIView作为容器(DetailViewContainer),这个容器包含你的5个详细UIView(DetailView)。如果你想在每个 DetailView 之间实现特定的过渡动画,你可以在 DetailViewContainer 中实现你的过渡动画。

如果我应该做和你一样的任务,我会按照以下方式做:

typedef enum
{
    firstDetailView,
    secondDetailView,
        ...
}DetailViewType;

@protocol DetailViewDelegate <NSObject>

- (void)detailViewDidEndEditingWithValue:(NSString)value detailViewType:(DetailViewType)detailViewType;

@end

//

@interface DetailViewController : UIViewController <DetailViewDelegate>
@end

@implementation DetailViewController
- (void)detailViewDidEndEditingWithValue:(NSString)value detailViewType:(DetailViewType)detailViewType
{
    //save new detail to model here
}
@end

//

@interface DetailView : UIView
@property(nonatomic, weak) id<DetailViewDelegate> delegate;
@end

@implementation DetailView
- (void)saveDetailValue
{
    [delegate detailViewDidEndEditingWithValue:self.value detailViewType:self.type];
}
@end

【讨论】:

    【解决方案2】:

    所以有很多方法可以解决这个问题,但要专门回答你关于必须使用 5 个视图控制器的问题......不。你不必这样做。您可以创建一个say...“QuestionViewController”来处理显示问题,然后不断将该控制器的新实例推送到具有不同问题的导航堆栈上。

    .h

    @interface QuestionViewController : UIViewController
    
    @property (nonatomic, strong) NSString *question;
    
    - (IBAction) nextQuestion:(id)sender;
    
    @end
    

    .m

    #import "QuestionViewController.h"
    #import "AppDelegate.h"
    
    
    @implementation QuestionViewController
    
    @synthesize question = _question;
    
    
    - (IBAction)nextQuestion:(id)sender
    {
        AppDelegate *delegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
    
        QuestionViewController *vc = [[QuestionViewController alloc]     initWithNibName:@"QuestionViewController"
                                                                              bundle:nil];
    
        vc.question = [delegate getNextQuestion];
    
        [self.navigationController pushViewController:vc
                                             animated:YES];
    }
    
    @end
    

    所以在我的示例中,应用程序委托将管理下一个问题,然后问题视图控制器将简单地获取下一个问题并将其自身的一个新实例推送到视图堆栈上。您可以将按钮连接到 nextQuestion:(id)sender 操作。如果您决定坚持“每个控制器一个问题”的想法,这应该足以让您继续前进。

    就像我说的,我并不是在权衡哪种类型的设计是最好的。我只是说如果你想按照你描述的方式来做......这将使你不必创建一堆类似的控制器。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      每个页面应该使用一个 ViewController
      如果您的文本字段在同一页面上,那么您应该使用一个带有 5 个子视图的 viewController。

      使用view setHidden,但如果你想要动画,那么简单的动画到全透明颜色(使用view.alpha = 0.0),然后隐藏。

      【讨论】:

        【解决方案4】:

        您真的可以尽情发挥,并在您的 5 UITextFields 中使用 IBoutletCollection 之类的东西。然后,您可以轻松管理要显示的正确 UITextField(基于问题的索引):

        Question 1 => UITextField (0)
        Question 2 => UITextField (1)
        

        然后您可以使用 Wojtek 建议的内容:带有一些效果的漂亮动画。

        【讨论】:

          【解决方案5】:

          单个文本字段和标签(用于问题)就可以了。每次有新问题到期时,您的单视图控制器都可以更改问题并清空文本字段。无需为 4 个隐藏视图/视图对和 1 个可见而烦恼。

          如果你想“免费”获得一些基本动画,那么选择一个启用分页的 UISlider,带有 5 对标签和文本字段。

          【讨论】:

            【解决方案6】:

            如果你想要简单的淡入/淡出过渡,你可以这样做

                [UIView animateWithDuration:duration animations:^{
                if(something)
                //fade in
                view.alpha = 1.f;
                else {
                //fade out
             view.alpha = 0.f;
                view.hidden = YES;
            }];
            

            【讨论】:

            • 你确定应该是[UIView animateWithDuration:duration animations:^{
            • 是的,我是,你问什么?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-02
            • 1970-01-01
            • 2014-10-07
            • 2017-08-21
            • 2021-02-07
            • 1970-01-01
            相关资源
            最近更新 更多