質問

私のアプリには、次のようなドリルダウンタイプのインターフェイスがあります。
ルートビュー。アイテムのリストと「追加」があります。ボタン。
アイテムを選択すると、「詳細」がプッシュされます。 navigationControllerで表示します。
「追加」を選択します;ボタンは「追加」を押します;表示。

追加ビューから詳細ビューにどのように移行しますか?

アニメーション化されていない「ポップ」を行うことを考えています。追加ビューで詳細コントローラーを押しますが、2番目の部分をアニメーション化するにはどうすればよいので、詳細ビューは垂直にスライドするか、追加ビューからフェードインしますか?

ありがとう、
ケルソ

役に立ちましたか?

解決

Raminの回答に基づいて、この方法を試すことができます。これは、いくつかのサンプルでAppleによって使用されています。

MyListViewController.h

#import "MyAddViewController.h"

@interface MyListViewController : UITableViewController <MyAddViewControllerDelegate> {
}

- (IBAction)add:(id)sender;
@end

MyListViewController.m

// Action for bring up add view controller
- (IBAction)add:(id)sender {
    MyAddViewController *addViewController = [[MyAddViewController alloc] initWithStyle:UITableViewStyleGrouped];
    addViewController.delegate = self;

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addViewController];
    [self presentModalViewController:navigationController animated:YES];

    [navigationController release];
    [addViewController release];     
}

// MyAddViewController's delegate method, dismiss the add view controller in here
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data{
if (data) {
   MyDetailViewController *detailViewController = [[MyDetailViewController alloc] initWithStyle:UITableViewStylePlain];
   detailViewController.data = data;
   [self.navigationController pushViewController:detailViewController animated:YES];
   [detailViewController release]; 
}
[self dismissModalViewControllerAnimated:YES];
}

MyAddViewController.h

@protocol MyAddViewControllerDelegate;
@class MyData;

@interface MCCourseAddTableViewController : UITableViewController {
@private
    MyData *data;
    id <MCCourseAddDelegate> delegate;
}

// MyData could be NSManagedObject if you want to use Core Data
@property(nonatomic, retain) MyData *data;
@property(nonatomic, assign) id <MyAddViewControllerDelegate> delegate;

- (void)save;
- (void)cancel;
@end

@protocol MyAddViewControllerDelegate <NSObject>
@optional
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data;;
@end

MyAddViewController.m

- (void)save {
    if (self.delegate != nil) {
        if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){
            if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){
                // Send data back to List View, to bring up detail view controller and dismiss add view controller
                [self.delegate addViewController:self didAddData:self.data];
            }
        }
    }
}

- (void)cancel {
    if (self.delegate != nil) {
        if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){
            if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){
                // Send nil back to ListView, to dismiss the add view controller only
                [self.delegate addViewController:self didAddData:nil];
            }
        }
    }
}

他のヒント

「追加」ビューを「詳細」ビューにプッシュし、それを記憶する変数を設定できます。 ユーザーがビューの追加をポップしようとすると、前の変数を確認し、設定されている場合は、ルートコントローラーに直接ポップします(詳細ビューを自動的にポップする必要があります)。

マルコ

追加ビューをモーダルにし、そこで「完了」を提供します; (または&quot; Save&quot;)と&quot; Cancel&quot;ボタン。ユーザーがキャンセルを押すと、モーダルが閉じます。 Doneを押した場合、新しいレコードをテーブルモデルに保存してから、戻る前にルートビューでテーブルのリロードを行います。素敵にするには、新しく追加したアイテムをフラッシュできます。

これを設定するクリーンな方法は、モーダルコントローラーに「Done」プロトコルメソッドを期待するデリゲートを実装させ、ルートコントローラーにそれを実装させ、それ自体をデリゲートとして設定させることです。

この方法では、ユーザーが「完了」を押すとルートコントローラーに通知されるため、発生する必要のあるすべてをカプセル化できます。追加ビューから詳細ビューに直接移動したい場合、デリゲートメソッドは新しく追加されたレコードに対して「プッシュ」を行うことができ、モーダルスライドダウンから詳細ビューへの優れた移行が得られます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top