2

ユーザーに自分自身に関する 5 つの詳細を入力してもらいたいのですが、退屈な 5 つのテキスト フィールド フォームを使用したくありません。ユーザーに一度に 1 つのテキスト フィールドを表示させたい -> ボタンをクリックして次のテキスト フィールドに移動する。私の質問は、これに 5 つのビュー コントローラーを使用する必要がありますか? 私はよりエレガントな方法を見つけようとしています。

使用されているすべてのテキストフィールドのようなものを考えましsetHidden:YESたが、アニメーション化されておらず、見栄えが悪いので、代替手段を探しています。

4

6 に答える 6

1

コンテナとして1UIViewController (DetailViewController)つだけを使用する必要があると思います。このコンテナには5つの詳細が保持されます。それぞれの間に特定のトランジションアニメーションが必要な場合は、内にトランジションアニメーションを実装できます。UIView(DetailViewContainer)UIView (DetailView)DetailViewDetailViewContainer

私があなたと同じ仕事をする必要がある場合、私は次のようにそれをします:

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
于 2012-12-12T19:01:58.643 に答える
1

したがって、これにアプローチする方法はたくさんありますが、5つのビューコントローラーを使用する必要があるという質問に具体的に答えるには...いいえ。その必要はありません。質問の表示を処理し、そのコントローラーの新しいインスタンスをさまざまな質問でナビゲーションスタックにプッシュし続ける「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アクションに接続できます。「コントローラーごとに 1 つの質問」という考え方に固執する場合は、これで十分です。

私が言ったように、私はどのタイプのデザインが最適かということを検討しているわけではありません。あなたが説明した方法でそれをやりたいのなら…と言っているだけです...これにより、同様のコントローラーをたくさん作成する必要がなくなります。

お役に立てれば!

于 2012-12-12T19:11:09.017 に答える
0

単一のテキスト フィールドとラベル (質問用) で十分です。新しい質問の期限が来るたびに、単一のビュー コントローラーで質問を変更し、テキスト フィールドを空にすることができます。4 つの非表示のビュー/ビューのペアと 1 つの表示に煩わされる必要はありません。

基本的なアニメーションを「無料」で使いたい場合は、5 組のラベルとテキスト フィールドを持つ、ページングを有効にした UISlider を使用します。

于 2012-12-12T19:45:13.087 に答える
0

ページごとに 1 つの ViewController を使用する必要があり
ます。テキストフィールドが同じページにある場合は、5 つのサブビューを持つ 1 つの viewController を使用する必要があります。

を使用view setHiddenしますが、アニメーションが必要な場合は、( を使用して)完全に透明な色に単純にアニメーション化してからview.alpha = 0.0、非表示にします。

于 2012-12-12T18:23:31.603 に答える
0

これで本当にワイルドになり、 5 で a のようなものを使用できIBoutletCollectionますUITextFields。次に、表示する正しいものを簡単に管理できますUITextField(質問のインデックスに基づいて):

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

次に、Wojtek が提案したものを使用できます: いくつかの効果を持つ素敵なアニメーションです。

于 2012-12-12T18:25:49.147 に答える
-1

シンプルなフェードイン/フェードアウトトランジションが必要な場合は、この方法で行うことができます

    [UIView animateWithDuration:duration animations:^{
    if(something)
    //fade in
    view.alpha = 1.f;
    else {
    //fade out
 view.alpha = 0.f;
    view.hidden = YES;
}];
于 2012-12-12T18:22:45.610 に答える