Переход между подпредставлениями в навигационном контроллере? - PullRequest
0 голосов
/ 06 марта 2009

В моем приложении у меня есть интерфейс типа детализации следующим образом:
Мой корневой вид, в котором есть список элементов и кнопка «Добавить».
Выбор элемента выдвигает представление «Сведения» на навигационном контроллере.
Выбор кнопки «Добавить» приводит к открытию представления «Добавить».

Как бы я перешел между представлением «Добавить» и представлением «Деталь»?

Я подумываю сделать неанимированную «всплывающую подсказку» в представлении «Добавить» и включить контроллер детализации, но как сделать анимированную вторую часть, чтобы представление детализации либо сдвинулось вертикально, либо исчезло из окна «Добавить» посмотреть

Спасибо
Келсо

Ответы [ 3 ]

0 голосов
/ 24 июля 2009

Сделайте вид добавления модальным и там предоставьте кнопку "Готово" (или "Сохранить") и кнопку "Отмена". Если пользователь нажимает кнопку отмены, вы просто закрываете модальное окно. Если они нажимают «Готово», вы сохраняете новую запись в табличной модели, а затем выполняете перезагрузку таблицы в корневом представлении перед возвратом. Чтобы быть милым, вы можете прошить только что добавленный элемент.

Простой способ установить это - заставить модальный контроллер реализовать делегат, который ожидает метод протокола «Готово», а корневой контроллер реализует его и установить себя в качестве делегата.

Таким образом, корневой контроллер уведомляется, когда пользователь нажимает «Готово», чтобы он мог инкапсулировать все, что должно произойти. Если вы хотите перейти непосредственно от добавления к подробному виду, метод делегата может сделать «толчок» для вновь добавленной записи, и вы получите хороший переход от модального скольжения вниз к подробному виду.

0 голосов
/ 24 июля 2009

На основании ответа Рамина вы можете попробовать этот способ, который 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];
            }
        }
    }
}
0 голосов
/ 08 марта 2009

Вы можете нажать Add View в представлении Details и установить переменную, чтобы запомнить это. Когда пользователь пытается открыть представление «Добавить», вы проверяете предыдущую переменную и, если установлено, вы подключаетесь непосредственно к корневому контроллеру (который должен автоматически отображать представление «Подробности»).

Marco

...