2014-12-12 4 views
0

В настоящее время у меня есть контроллер навигации, который содержит один контроллер вида и два контроллера табличного вида. Когда пользователь переходит ко второму контроллеру представления таблицы, он может нажимать элемент кнопки «+», который представляет собой другое табличное представление со статической ячейкой, содержащей текстовое поле. Пользователь может ввести текст и нажать «Готово», чтобы сохранить его. Когда мой метод-делегат вызывается, диспетчер представлений отклоняется и строка, введенная пользователем, добавляется к массиву во втором контроллере представления. Затем в представлении таблицы отображается введенный пользователем текст в ячейке таблицы. Массив передан в стек через метод prepareForSegue. В настоящее время это работает, потому что я вижу строки в представлении таблицы, с которыми был создан массив в первом контроллере представления.Как передать данные с третьего контроллера просмотра Вернуться к первому виду контроллера?

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

Я понимаю, что массивы в Swift являются структурами и значения копируются при передаче стека. Это имеет смысл, почему данные, введенные пользователем, исчезают, когда я перехожу к предыдущему контроллеру представления. Предыдущий контроллер представления фактически не содержит данные, введенные пользователем. Означает ли это, что мне нужно добавить строку в массив в исходном контроллере представления вместо массива во втором контроллере представления таблицы? Если это так, я не знаю, как получить доступ к контроллеру начального представления с третьего контроллера.

Все документы и учебники, к которым я обращался, основаны на передаче данных с текущего контроллера представления назад на предыдущий контроллер представления, который является делегатом, который затем отклоняет контроллер представления, который принял вход.

Как передать введенную пользователем строку с последнего контроллера представлений обратно в контроллер исходного вида?

+0

Контроллеры просмотра не должны знать, что контроллер родительского представления существует. Родитель может разговаривать с ребенком, но ребенок никогда не должен разговаривать с родителем. Если ребенок что-то меняет, он отправляет уведомление, а родитель берет его оттуда. –

ответ

1

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

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

2

На самом деле в Objective C есть много механизмов обмена сообщениями, и в дополнение к ответу Филлипа я могу предложить вам использовать NSNotificationCenter, используя который вы можете отправлять уведомления и ловить их там, где это необходимо. Отправленное уведомление может иметь пользовательский объект, строку в вашем случае и имя, для которого вы должны добавить наблюдателя, чтобы получить это уведомление.

Регистрация для конкретного уведомления: уведомление

[[NSNotificationCenter defaultCenter] addObserver:{object_to_handle_notification} selector:@selector(notificationReceived:) name:@"my_notification" object:nil]; 

Отправления:

[[NSNotificationCenter defaultCenter] postNotificationName:@"my_notification" object:userEnteredString]; 

Обработка уведомление:

- (void)notificationReceived:(NSNotification *)notification 
{ 
    NSString *userEnteredString = notification.object; 
    //do whatever you want with the user entered string 
} 

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

0

Что вы можете сделать, это передать firstViewController в качестве параметра в ThirdViewController в методе prepareForSegue из SecondViewContorller.

FirstViewController:

class FirstViewController: UIViewController { 
    var a:String! 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     var destination=segue.destinationViewController as? SecondViewController 
     destination?.firstViewCont=self 
    } 
} 

SecondViewController:

class SecondViewController: UIViewController { 
    var firstViewCont:FirstViewController! 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     var destination=segue.destinationViewController as? ThirdViewController 
     destination?.FViewCont=self.firstViewCont 
    } 
} 

ThirdViewController:

class ThirdViewController: UIViewController { 
    var FViewCont:FirstViewController! 

    @IBAction func textFieldEdited(sender: UITextField) { 
     FViewCont.a!=sender.text 
    } 
} 

Это одна из наиболее непрактичным способом можно было бы сделать это. Я предлагаю вам узнать о Navigation View Controllers. Они работают как шарм, когда делают что-то подобное. Пожалуйста, проголосуйте и отметьте это, если я помогу.

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