Up в viewDidLoad у меня есть:insertNewObject seque к detailViewController с newManagedObject
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
Для insertNewObjectMethod у меня есть:
- (void)insertNewObject:(id)sender
{
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
CommodityTypes *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
self.detailViewController.detailItem = newManagedObject;
self.detailViewController.context = context;
[self performSegueWithIdentifier:@"showCommodityTypesDetail" sender:sender];
}
Существует также:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showCommodityTypesDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
CommodityTypes *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext;
[[segue destinationViewController] setDetailItem:object];
[[segue destinationViewController] setContext:context];
}
}
Когда я строю & запустите приложение и выберите кнопку +, чтобы перейти к странице подробностей, но d oes не загружает информацию newManagedObject.
Я предполагаю, что executeSegueWithIdentifier запускает вызов prepareForSeque и потому, что нет выбранной строки, ничего не загружается, но этот метод переопределяет предыдущий self.detailViewController.detailItem = newManagedObject; self.detailViewController.context = context;
Как мне обойти это? Сначала предположим, что insertNewObject создает newManagedObject. Как выбрать строку, которая отображается в таблице?
Начало iOS-программист здесь.
Эврика self.detailViewController
является контроллером экземпляра детального вида, используемого IPAD контроллера Разделить не вид детали контроллер экземпляра используется интерфейсiPhone.
performSegueWithIdentifier
отправить сообщение prepareForSegue
. Чтобы исправить свою проблему, мне пришлось сделать две вещи.
Создайте второй переход от контроллера главного вида к контроллеру подробного представления. Оригинальный сек был связан со строкой таблицы с контроллером подробного представления. Второй сегмент я связал с контроллером главного представления с контроллером подробного представления. (Используйте значок контроллера вида в нижнем колонтитуле контроллера вида в Interface Builder.)
Перемещение линий создания объектов от insertNewObject
до prepareForSeque
в инструкции if, которая выбирает уникальное имя второго сегмента.
- (void)insertNewObject:(id)sender
{
[self performSegueWithIdentifier:@"ctAddButtonToDetail" sender:sender];
}
и
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ctMasterRowToDetail"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
CommodityTypes *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
NSManagedObjectContext *context = self.fetchedResultsController.managedObjectContext;
[[segue destinationViewController] setDetailItem:object];
[[segue destinationViewController] setContext:context];
}
if ([[segue identifier] isEqualToString:@"ctAddButtonToDetail"]) {
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
CommodityTypes *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[[segue destinationViewController] setDetailItem:newManagedObject];
[[segue destinationViewController] setContext:context];
}
}
Моя проблема в том, что нет выбранной строки. Я выбираю кнопку + на панели навигации. Я хочу, чтобы это можно было перейти непосредственно к представлению деталей вместо того, чтобы вручную выбрать новую строку после ее выбора. – adamek
В этом случае ваш запрос данных с использованием NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow]; тоже не имеет значения? Это должно означать, что вы можете в любой момент подготовить данные в файле prepareForSegue. – SomaMan
Eureka! 'self.detailViewController' - это контроллер просмотра _instance_, который использует вид разделения iPad. Это ** не ** экземпляр контроллера представления, который находится в интерфейсе iPhone. – adamek