почему этот код использует presentModalViewController? (не pushViewController) - PullRequest
4 голосов
/ 23 февраля 2011

Кто-нибудь понимает, почему в примере кода CoreDataBooks это:

(a) метод разницы в обмене контроллером

В то время как при щелчке по элементу и переходе к подробному виду используется стандартная концепция UINavigationController « pushViewController », при нажатии на кнопку «Добавить» кнопку новой записи запускается новый вид для добавления записи с помощью подхода " presentModalViewController "? То есть, не мог ли подход быть одинаковым в обоих случаях, просто используя подход pushViewController?

Есть ли на самом деле какие-либо преимущества в использовании каждого подхода, для которого он используется? Я не совсем вижу. Я предполагаю, что у Apple должно было быть что-то, чтобы выбрать эти разные подходы для разных сценариев. Например:

  1. любые различия для пользователя (т.е. UI различия или функциональность различия) что они увидят?

  2. любые отличия для разработчика (или достоинства / недостатки)

Например, если вы рассматриваете возможность использования подхода pushViewController вместо подхода presentModalViewController для сценария «Добавить» ...

(b) разница в подходе к обмену данными

подход к тому, как они разделяют общий объект данных, кажется другим - так что опять просто интересно, почему подходы не были одинаковыми? (т.е. в обоих случаях главный контроллер временно переходит к другому представлению, и между ними есть некоторые общие данные - то есть, что дочернее представление должно возвращаться родителю)

Извлечение кода для удобства

То есть для «Правка»:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Create and push a detail view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
    Book *selectedBook = (Book *)[[self fetchedResultsController] objectAtIndexPath:indexPath];

    // Pass the selected book to the new view controller.
    detailViewController.book = selectedBook;
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

Но для "Добавить"

- (IBAction)addBook {
    AddViewController *addViewController = [[AddViewController alloc] initWithStyle:UITableViewStyleGrouped];
     addViewController.delegate = self;

     // Create a new managed object context for the new book -- set its persistent store coordinator to the same as that from the fetched results controller's context.
     NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
     self.addingManagedObjectContext = addingContext;
     [addingContext release];

     [addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
     addViewController.book = (Book *)[NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:addingContext];
     UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addViewController];
        [self.navigationController presentModalViewController:navController animated:YES];

     [addViewController release];
     [navController release];

}

спасибо

Ответы [ 2 ]

9 голосов
/ 23 февраля 2011

Вы используете модальные контроллеры представления, чтобы сосредоточить внимание пользователя на Задаче.Когда вы нажимаете, пользователь находится в каком-то навигационном потоке, но все еще имеет общее приложение под рукой.Они могут решить пойти вперед или назад, переключиться на другую вкладку посередине, что угодно.Когда они получают контроллер модального представления, они не могут ничего сделать до тех пор, пока задача не будет завершена или отменена (модальное представление отклонено)

1 голос
/ 28 сентября 2012

[Предупреждение: этот ответ в большей степени относится к обновленному коду CoreDataBooks, который был изменен для использования нового метода setParentContext в iOS5 NSManagedObjectContext вместо того, чтобы связываться с persistentStoreCoordinator [

На ваш второй вопрос об обмене данными также отвечает модальный подход Add vs modeless Edit. Запустите приложение в симуляторе и обратите внимание, что:

  1. , если вы нажмете Добавить, в вашем следующем окне есть кнопки Сохранить и Отменить

  2. , если вы нажмете на Изменить, у вашего следующего вида есть только кнопка Готово.

(Теперь, в этом конкретном проекте, вы должны редактировать каждое поле за раз, и редактирование поля выполняется в еще одном представлении, и у этого есть кнопка Отмена, но пока игнорируйте это, потому что

а. это относится только к области. Например. Если вы отредактируете заголовок и нажмете кнопку «Сохранить», вы вернетесь к представлению «Изменить» с кнопкой «Готово», теперь нет отмены, чтобы отменить это изменение, вы можете нажать только «Готово». Что касается этого представления, вы отредактировали режим BookLESSly

б. Какой хромой интерфейс! Заходите в Apple, превратите CoreDataBooks в приличное, хотя и простое приложение, соответствующее вашим собственным правилам. По крайней мере поместите редактирование в ячейки

Где мы были? О да, «Редактировать» - у существующей Книги есть modeLESS, поэтому она передает исходную Книгу в том же MOC (NSManagedObjectContext), и вы не можете отменить свои изменения в ней в представлении «Редактировать». «Добавить» - книгу, с другой стороны, это MODAL: она создает новую книгу для редактирования в подробном представлении и хочет отменить ее, если пользователь нажимает кнопку отмены. Для достижения этого он должен использовать второй MOC, который является потомком первого. Если пользователь отменяет, он просто игнорирует новый дочерний MOC, фактически отбрасывая новую книгу; если пользователь сохраняет, он сохраняет дочерний MOC, который помещает новую книгу и ее свойства в родительский MOC, а затем сохраняет родительский MOC.

Этот подход «ребенок-МОК», кстати, подробно описан в презентации 303 WWDC 2011 «Что нового в Базовых данных на iOS». Есть и другие подходы, обсуждаемые в других местах SO, включая

  • Создание нового управляемого объекта с нулевым MOC и вставка его в родительский MOC только при нажатии пользователем кнопки save

  • Не используется управляемый объект, но другая структура данных для временного объекта (новая книга, в которой мы пока не уверены, что мы хотим сохранить), например NSDictionary, или просто набор различных переменных

  • и более ...?

Я предпочитаю подход родитель-потомок, потому что Apple отдает ему предпочтение и потому, что он использует объекты модели данных вместо создания параллельных структур данных для временных объектов. Подход с нулевым контекстом также имеет это преимущество и дополнительное преимущество (по-видимому) лучшей производительности и простоты (читай мне: никаких новых MOC). Но я не уверен, что управляемые объекты без контекстов управляемых объектов являются кошерными.

Кстати, CoreDataBooks не совсем соответствует соглашению, изложенному в вышеупомянутой презентации, поскольку не сохраняет контекст parent в блоке executeBlock.

Также я не уверен, почему он устанавливает новый управляемый контекст как свойство в AddViewController и не использует его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...