function aus anderer Klasse/datei aufrufen/ausführen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • function aus anderer Klasse/datei aufrufen/ausführen

    Hallo,

    ich habe ein Problem mit dem ausführen einer Funktion aus einer anderen Klasse/ Datei heraus.

    und zwar, habe ich eine Datei viewController in welcher sich eine Funktion zum dynamischen erstellen eines TableView befindet.
    rufe ich diese Funktion nun innerhalb dieser Klasse über meinen Button auf klappt alles so wie es soll und der tableview wird erstellt.

    rufe ich diese Funktion allerdings von außerhalb aus meiner anderen Klasse/datei auf, bringt er mir immer einen Fehler

    Quellcode

    1. fatal error: unexpectedly found nil while unwrapping an Optional value

    was ich nun nicht begreife warum ich nun plötzlich einen value mit nil habe. Laut Compiler hat der button nil. Aber aus der anderen Klasse heraus hatte alles funktioniert und nix mit value nil.

    Hier mal die 2 Dateien

    Quellcode

    1. import UIKit
    2. class ViewController: UIViewController, UIPopoverPresentationControllerDelegate, UITableViewDataSource, UITableViewDelegate {
    3. @IBOutlet weak var addButton: UIButton!
    4. var tableView: UITableView! = UITableView()
    5. //***********************************************
    6. override func viewDidLoad() {
    7. super.viewDidLoad()
    8. }
    9. //***********************************************
    10. func createTableView() {
    11. println("createTableView-Funktion aufgerufen")
    12. tableView.frame = CGRect(x: 0, y: 20, width: self.view.frame.width, height: self.view.frame.height - self.addButton.frame.height - 20)
    13. tableView.delegate = self
    14. tableView.dataSource = self
    15. tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    16. tableView.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha: 0)
    17. self.view.addSubview(tableView)
    18. }
    19. //***********************************************
    20. func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    21. return 7
    22. }
    23. func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    24. return "Section \(section)"
    25. }
    26. func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    27. let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell
    28. cell.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha: 0.3)
    29. cell.textLabel?.text = "Row \(indexPath.row)"
    30. return cell
    31. }
    32. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    33. println("Row \(indexPath.row) ausgewählt")
    34. }
    35. //***********************************************
    36. //--> addButton Funktion
    37. @IBAction func addNewEntry(sender: AnyObject) {
    38. //createTableView()
    39. //Popover
    40. let storyboard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
    41. var popNewEntryController: PopNewEntryViewController = storyboard.instantiateViewControllerWithIdentifier("PopNewEntryViewController") as! PopNewEntryViewController
    42. popNewEntryController.modalPresentationStyle = .Popover
    43. popNewEntryController.preferredContentSize = CGSizeMake(300, 200)
    44. let popoverController = popNewEntryController.popoverPresentationController
    45. popoverController?.permittedArrowDirections = .Down
    46. popoverController?.delegate = self
    47. popoverController?.sourceView = sender as! UIButton
    48. popoverController?.sourceRect = CGRect(x: sender.size.width / 2, y: -2, width: 1, height: 1)
    49. presentViewController(popNewEntryController, animated: true, completion: nil)
    50. }
    51. //***********************************************
    52. func adaptivePresentationStyleForPresentationController(
    53. controller: UIPresentationController) -> UIModalPresentationStyle {
    54. return .None
    55. }
    56. //***********************************************
    57. override func didReceiveMemoryWarning() {
    58. super.didReceiveMemoryWarning()
    59. // Dispose of any resources that can be recreated.
    60. }
    61. //***********************************************
    62. }
    Alles anzeigen
    und die 2. aus der es dann nicht mehr funktioniert

    Quellcode

    1. import UIKit
    2. class PopNewEntryViewController: UIViewController {
    3. //Outlets
    4. //Properties
    5. //***********************************************
    6. override func viewDidLoad() {
    7. super.viewDidLoad()
    8. }
    9. //***********************************************
    10. override func didReceiveMemoryWarning() {
    11. super.didReceiveMemoryWarning()
    12. }
    13. //***********************************************
    14. //***********************************************
    15. //***********************************************
    16. //Actions
    17. @IBAction func cancelButton(sender: AnyObject) {
    18. }
    19. @IBAction func acceptButton(sender: AnyObject) {
    20. }
    21. @IBAction func thisWeekButton(sender: AnyObject) {
    22. println("thisWeekButton gedrückt")
    23. ViewController().createTableView()
    24. }
    25. @IBAction func nextWeekButton(sender: AnyObject) {
    26. }
    27. }
    Alles anzeigen
    was kann ich da tun, dass es funktioniert?

    PS: der tableView soll im ViewController angezeigt werden. Die 2. datei ist mit einem Uopoverview verknüpft. in diesem befindet sich der button zum aufrufen der createTableView-Funktion.
  • _Micha_ schrieb:

    was ich nun nicht begreife warum ich nun plötzlich einen value mit nil habe. Laut Compiler hat der button nil. Aber aus der anderen Klasse heraus hatte alles funktioniert und nix mit value nil.
    Die Instanzvariable addButton ist plötzlich nil, weil du in der Zeile 42 deiner PopNewEntryViewController Klasse eine neue Instanz der ViewController Klasse erstellst. Diese erstellte Instanz hat nichts mit der Instanz zu tun, die du im Interface-Editor erstellt hast.

    Merke: Code-Datei != Instanz

    Du brauchst in der Klasse PopNewEntryViewController eine Referenz auf die Instanz des ViewControllers, die du im Interface-Editor erstellt hast. Über diese Referenz kannst du dann die Methode createTableView aufrufen.
  • Danke für die Antworten.

    stimmt die Referenz hab ich vergessen (bin halt noch Anfänger :S )

    die hab ich nun so hinzugefügt:

    Quellcode

    1. @IBAction func thisWeekButton(sender: AnyObject) {
    2. println("thisWeekButton gedrückt")
    3. let storyboard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
    4. let viewController: ViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
    5. viewController.createTableView()
    6. }

    jetzt ruft es mir die Funktion createTableView zwar auf (seh ich durch println()) und es bringt mir auch keine Fehler mehr, aber es wird kein TableView im ViewController erzeugt. ?(
  • wie mache ich das?

    So?

    Quellcode

    1. if let stb = storyboard {
    2. if let vc = viewController {
    3. vc.createTableView()
    4. }
    5. }

    und

    Quellcode

    1. if self.view != nil {
    2. self.view.addSubview(tableView)
    3. println("view hinzugefügt")
    4. } else {
    5. println("self.view = nil")
    6. }
    falls ja, ändert das nichts.
  • _Micha_ schrieb:

    Danke für die Antworten.

    stimmt die Referenz hab ich vergessen (bin halt noch Anfänger :S )

    die hab ich nun so hinzugefügt:

    Quellcode

    1. @IBAction func thisWeekButton(sender: AnyObject) {
    2. println("thisWeekButton gedrückt")
    3. let storyboard : UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
    4. let viewController: ViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
    5. viewController.createTableView()
    6. }
    jetzt ruft es mir die Funktion createTableView zwar auf (seh ich durch println()) und es bringt mir auch keine Fehler mehr, aber es wird kein TableView im ViewController erzeugt. ?(
    Damit änderst du nicht viel. Du erzeugst immer noch eine zweite Instanz des ViewControllers und der von diesem Controller verwaltete View wird ja nicht angezeigt. Du brauchst eine Referenz auf den ViewController, der bereits vorhanden ist. Die Referenz kannst du zum Beispiel in der Methode addNewEntry(), wo du den PopNewEntryViewController instanzierst übergeben.
  • jetzt hab ich es hoffentlich verstanden

    also durch

    erstellen einer variable im PopNewEntryViewController und dieser dann im ViewController in der addNewEntry() Methode den View, also self, zuweisen. :D

    Quellcode

    1. (popNewEntryController as PopNewEntryViewController).viewController = self
    schwere Geburt


    Danke für deine Geduld :thumbup: