2014-11-03 2 views
-1

Я изучаю разработку для iOS и при создании простого приложения, которое загружает данные из базы данных и показывает это как табличное представление, у меня есть некоторые проблемы, которые я пока не понимаю. Классы мастера - детали контроллеров были созданы мной, а не шаблоном XCode, если это имеет значение.Каков правильный способ передачи данных с главного на контроллер представления деталей?

  1. попытке передать данные из контроллера мастер Tableview к деталям контроллера. Данные просты, как несколько строк. Для этой цели я использую segue. В prepareForSegue методе я делаю следующее:

    if ([segue.identifier isEqualToString: @"DetailsSegue"]) { 
        DetailsViewController* dvc = (DetailsViewController*)segue.destinationViewController; 
        NSInteger selectedRow =[self.tableView indexPathForSelectedRow].row; 
        dvc.nameLabel.text = [NSString stringWithFormat:@"%@", 
            [[self.entitiesArray objectAtIndex:selectedRow name]]; 
        ... 
    } 
    

    Проблема здесь состоит в том, что dvc.nameLabel является nil. И я думаю, что возможно потому, что контроллер еще не был полностью создан. Ну, указатель dvc не nil, но я не вижу записи в моем методе init, поэтому моя идея, что он не был инициализирован.

    я решил создать переменный экземпляр DetailsViewController и prepareForSegue установить его:

    dvc->name = [NSString stringWithFormat:@"%@", 
          [[self.entitiesArray objectAtIndex: selectedRow] name]]; 
    

    , а затем я установил nameLabel свойство в viewDidLoad методы

    И это на самом деле работает! Поэтому, я думаю, я не смог бы установить переменную экземпляра униализированного экземпляра. Но я сделал. Так что случилось? И я чувствую, что это не так, как люди делают это, , чтобы иметь еще одну переменную, которая держит то же самое, кажется избыточным.

Так что правильный способ передачи переменного (в моем случае NSString) с помощью SEGUE на другой контроллер?

Спасибо ребят за помощь

+0

Возможный дубликат [Передача данных между контроллерами представлений] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) –

ответ

0

Если вы хотите проход данных, вы делаете это разумно. Элементы пользовательского интерфейса не гарантируются для инициализации до тех пор, пока основной вид контроллера представления не завершит загрузку, поэтому переменная не-UI довольно распространена.

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

+0

Является ли модельный класс в этом подходе синглом? – rightaway717

+0

Это может быть одноэлементный, или это может быть объект, который вы можете получить от делегата приложения, как окно приложения и контроллер корневого представления для иерархии представления и контроллера. –

1

Проблема в вашем коде заключается в том, что вы пытаетесь манипулировать другими видами VCs. Не делай этого. Вместо этого вы должны создать свойства в контроллере представления назначения для хранения данных, которые вы хотите отобразить.

Как сказал другой плакат, имеет смысл создать класс, содержащий данные для записи, и передать это. Возможно, ваша модель контроллера главного представления будет массивом этих объектов. Мастер будет использовать объекты данных для заполнения вида таблицы. Когда пользователь щелкнул по строке, чтобы открыть подробное представление, вы должны передать копию этого объекта данных контроллеру подробного представления в prepareForSegue.

Контроллер подробных представлений может затем отредактировать его, если это необходимо, и передать отредактированный объект обратно в контроллер главного представления, если пользователь сохранил изменения или просто отменил отредактированный объект, если пользователь отменяет.

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

+0

+1 для указания, как это сделать правильно, и почему я делаю это неправильно. – rightaway717

Смежные вопросы