2016-12-10 12 views
0

В принципе, у меня есть пять контроллеров представлений, первый из которых имеет два текстовых поля, посредством которых пользователь может вводить в них значения. Впоследствии, исходя из выбора пользователя из двух представлений сборщика, он либо будет направлен на второй, третий, четвертый или пятый контроллер просмотра, используя функцию instantiateViewController, как только будет нажата кнопка «Далее». Таким образом, никакие segues не использовались вообще здесь.Передача данных между представлениями, учитывая, что я использую функцию instantiateViewController

То, что я хотел бы сделать, это:

(1) Перенести данные, которые пользователь ввел в текстовых полях в первом контроллере представления либо второй, третий, четвертый или пятый контроллер представления в зависимости от его/ее выбор на выборщики?

(2) Когда пользователь возвращается со второго, третьего, четвертого или пятого вида на первый вид. Я хочу, чтобы данные, которые он ввел в текстовые поля, были сохранены?

Я попытался использовать prepareforsegue и ввести segues между самими контроллерами представления, а не привязывать их к кнопкам. Однако для меня все не получилось.

Любая помощь по вышесказанному очень ценится!

Thanks, Shadi.

Вот мой код первой ViewController который не работает:

импорт UIKit

класс ViewController: UIViewController {

@IBOutlet var TextField: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func NextVC(_ sender: Any) { 

    let storyboard : UIStoryboard = UIStoryboard (name: "Main", bundle: nil) 
    let nextViewController = storyboard.instantiateViewController(withIdentifier: "secondVC") as UIViewController 
    self.present(nextViewController, animated: true, completion: nil) 
    performSegue(withIdentifier: "fromFirstToSecondVCSegue", sender: self) 
    func prepareForSegue (segue: UIStoryboardSegue, sender: Any?) { 

     var DestViewController : SecondViewController = segue.destination as! SecondViewController 

    } 

}

}

Пожалуйста посоветуйте, что мне нужно сделать, чтобы исправить это?

+0

Значения сохраняются в навигационном контроллере. Вы пробовали это? В противном случае вы просто используете prepareForSegue для передачи данных обратно в исходный контроллер просмотра. – Ro4ch

+1

Когда вы создаете экземпляр нового контроллера вида, вы можете передать данные, просто установив свойства так же, как в 'prepareForSegue'. Чтобы передать данные назад, вам нужно использовать шаблон делегирования. Тем не менее, segues и unind segues лучше. Каковы были ваши проблемы? – Paulw11

ответ

1

1) В вас другие (втором, третьем, четвертом или пятом) виде контроллер имеет свойство, которое вы хотите сохранить, например, String,

class FirstViewController: UIViewController { 

    var string: String? 
    } 

Затем, когда в первом контроллере представления, когда инстанцирование другого контроллера зрения, вы может передавать данные, как это:

otherViewController.string = "Some string" 
self.present(otherViewController, animated: true, completion: nil) 

2) Если вы представите другой контроллер с настоящим способом просмотра я уверен, 99%, что текст в текстовом поле будет сохранен. Если нет, когда вы представляете другой контроллер просмотра, сохраните эти данные в UserDefaults и напишите его на viewWillApear.

Edit:

let nextViewController = storyboard.instantiateViewController(withIdentifier: "secondVC") as! SecondViewController 
nextViewController.yourPropertyInVC = dataYouWantToPass 
self.present(nextViewController, animated: true, completion: nil) 

Примечание Если вы не перекрывая подготовки к методу SEGUE нет необходимости вызывать его.

+1

NSUserDefaults не предназначен для передачи данных. Правилом делегации является лучший подход. – Paulw11

+0

@ Paulw11 Это для второго ответа, сохраняющего данные из текстового поля, в первом ответе объясняется передача данных. – Markicevic

+1

Да, первая часть в порядке – Paulw11

0

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

Для чувствительных данных, таких как информация о логине/пароле, используйте KeyChain.В противном случае вы можете использовать UserDefaults (SwiftyUserDefaults делает это очень просто: https://github.com/radex/SwiftyUserDefaults) или создать одноэлементный класс и установить ваши данные в его свойствах.

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

  • Нет связанных вопросов^_^