2012-04-14 3 views
0

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]; 

    } 
} 

ответ

1

В вашем insertNewObject: метод, у вас есть эти две линии -

self.detailViewController.detailItem = newManagedObject; 
self.detailViewController.context = context; 

... которые предполагают, что вы уже пытались инициализацию detailViewController, который вы собираетесь к непосредственно перейти. Вам не нужно это делать, оно автоматически инициализируется, потому что вы связаны с раскадрой, и передаете ему любую информацию, которую вы хотите получить в методе prepareForSegue: sender: method - в том виде, в котором вы это делаете.

Что касается получения правильных данных, возможно, вы могли бы сделать это в методе делегата tableView, tableView: didSelectRowAtIndexPath :, и просто установите ivar на номер строки выбранной строки, чтобы вы могли получить информацию в файле prepareForSegue: метод.

+0

Моя проблема в том, что нет выбранной строки. Я выбираю кнопку + на панели навигации. Я хочу, чтобы это можно было перейти непосредственно к представлению деталей вместо того, чтобы вручную выбрать новую строку после ее выбора. – adamek

+0

В этом случае ваш запрос данных с использованием NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow]; тоже не имеет значения? Это должно означать, что вы можете в любой момент подготовить данные в файле prepareForSegue. – SomaMan

+0

Eureka! 'self.detailViewController' - это контроллер просмотра _instance_, который использует вид разделения iPad. Это ** не ** экземпляр контроллера представления, который находится в интерфейсе iPhone. – adamek

0

Вы обеспечиваете объект в контроллере представления назначения. Вам также не нужно указывать контекст ... который может быть получен из самого объекта (все NSManagedObjects имеют свойство managedObjectContext).

Похоже, вы передаете информацию. Я не знаю, что вы имеете в виду в выбранной части.

На контроллере вида, который находится в секвенсе, вам необходимо убедиться, что вы захватили передаваемые данные ... viewDidLoad - наиболее распространенное место.