2017-09-02 3 views
0

Ich habe zwei View-Controller und eine schnelle Datei. Ich möchte die Daten von einem View-Controller zum anderen weitergeben, ohne den anderen View-Controller zu verwenden oder den anderen zu präsentieren.Werte aus dem Textfeld eines View-Controllers abrufen

View-Controller:

import UIKit 
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var questions:[Question] = [] 

var sub = "" 
var send = "" 
var det = "" 

@IBOutlet weak var questionsender: UISegmentedControl! 
@IBOutlet weak var tableView: UITableView! 
override func viewDidLoad() { 
    super.viewDidLoad() 
} 
override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    self.tableView.reloadData() 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return questions.count 
} 
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 50 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "forumcell", for: indexPath) as! ForumTableViewCell 
    cell.questionsubject.text = questions[indexPath.row].subject 
    cell.sender.text = questions[indexPath.row].sender 
    return cell 
} 


} 

Swift-Datei:

import Foundation 
class Question 
{ 
var subject = "" 
var descript = "" 
var sender = "" 
init(subject : String, descrip: String,sender : String) 
{ 
    self.sender=sender 
    self.descript=descrip 
    self.subject=subject 
} 
} 

Second-View-Controller:

import UIKit 

class AddVC: UIViewController,UITextFieldDelegate { 
var qsender = "" 
var subject = "" 
var details = "" 

@IBAction func postBttn(_ sender: Any) { 
    if questiondetails.text == "" || question_sender.text == "" || question_subject.text == "" 
    { 
     let alert = UIAlertController(title: "Invalid!", message: "One of the fields has not been entered", preferredStyle: .alert) 

     let bttn = UIAlertAction(title: "Ok", style: .cancel, handler: nil) 
     alert.addAction(bttn) 

    } 
    else 
    { 
     qsender = question_sender.text 
     subject = question_subject.text 
     details = questiondetails.text 
     let q=Question(subject: subject, descrip: details, sender: qsender) 
     let v = ViewController() 
     v.send = qsender 
     v.sub = subject 
     v.det = details 
     dismiss(animated: true, completion: nil) 
    } 
} 
@IBAction func closeBttn(_ sender: Any) { 
    dismiss(animated: true, completion: nil) 
} 

@IBOutlet weak var question_subject: UITextView! 
@IBOutlet weak var question_sender: UITextView! 
@IBOutlet weak var closeBttn: UIButton! 

@IBOutlet weak var questiondetails: UITextView! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    question_subject.placeholderText="Sender" 
    question_subject.placeholderText="Subject" 
    questiondetails.placeholderText="Description" 
    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(swiped(_ :))) 
    swipeDown.direction = .down 
    self.view.addGestureRecognizer(swipeDown) 

} 
func swiped(_ gesture:UISwipeGestureRecognizer) 
{ 
    dismiss(animated: true, completion: nil) 
} 
} 

Das Objekt v I für View-Controller erstellt wurden, können die Daten nicht Mitglieder durch die Aktualisierung AddVC-Klasse.

+0

Wie hängen die 2 View Controller zusammen? Geht man in den anderen über? Und gibt es eine Reihenfolge, in der sie dem Benutzer präsentiert werden? – Brian

+0

Nicht zu 100% sicher, warum diese beiden viewControllers nicht miteinander verbunden sein sollten, aber Sie können immer 'CoreData' verwenden, um die notwendigen Daten zu speichern und abzurufen. – sCha

+0

Die Werte werden vom Benutzer angegeben. Ich entwickle ein Forum, also müssen die eingegebenen Daten zum Server gehen. –

Antwort

0

diese Zeile hinzufügen Viewcontroller:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    static let viewControllerSegueIdentifier: String = "ViewController" 

Vergewissern Sie sich, dass die viewControllerSegueIdentifier Zeichenfolge Ihre segue Kennung übereinstimmt.

dann diese Änderungen an AddVC machen:

@IBAction func postBttn(_ sender: Any) { 
     if questiondetails.text == "" || question_sender.text == "" || question_subject.text == "" 
     { 
      let alert = UIAlertController(title: "Invalid!", message: "One of the fields has not been entered", preferredStyle: .alert) 

      let bttn = UIAlertAction(title: "Ok", style: .cancel, handler: nil) 
      alert.addAction(bttn) 

     } 
     else 
     { 
      qsender = question_sender.text 
      subject = question_subject.text 
      details = questiondetails.text 
      dismiss(animated: true, completion: { 
       goToAddScreen(segueIdentifier: ViewController.viewControllerSegueIdentifier) 
      }) 
     } 
} 

dann diese zwei Methoden hinzufügen:

func goToAddScreen(segueIdentifier: String) { 
     performSegue(withIdentifier: segueIdentifier, sender: self) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == ViewController.viewControllerSegueIdentifier { 
      guard let controller = segue.destination as? ViewController else { 
       return 
      } 
      let q=Question(subject: subject, descrip: details, sender: qsender) 
      controller.questions.append(q) 
     } 
} 
+0

funktionierte immer noch nicht funktioniert ... die Werte nicht –

+0

bearbeitet im View-Controller aktualisiert wird, ich nicht erkennen, dass Sie nicht mehr waren mit diesen Variablen "var sub = "" \t var send = "" \t var det = """. Versuche es jetzt – Brian

0

in Viewcontroller:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let destination = segue.destination as! AddVC 
    destination.callbackFromAddVC = { stringData in 
     // use stringData 
    } 
} 

in AddVC:

var callbackFromAddVC: ((String) -> Void)? = nil 

func swiped(_ gesture:UISwipeGestureRecognizer) 
{ 
    self.callbackFromAddVC?("myStringData that needs to be transferred") 
    dismiss(animated: true, completion: nil) 

    self.callbackFromAddVC = nil 
} 
Verwandte Themen