Meine erste App, deren Fehler und Optimierungen

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

  • Meine erste App, deren Fehler und Optimierungen

    Hallo alle zusammen,

    wie einige schon mitbekommen haben, bin ich dabei meine erste App zu "entwickel"
    ich stoße sehr oft an meine Grenzen, komme aber immer weiter :)

    Jetzt kommt mittlerweile der Punkt, wo schon viel entstanden ist und ich Mal eine "Zwischenmeinung" brauche

    So sieht mein Storyboard aus:


    So sieht mein ViewController.Swift aus:

    Ist soweit alles gut oder habe ich etwas falsch gemacht?


    Habe aktuell folgenden Fehler:
    - Ich starte die App und sehe den TableView mit den Inhalten aus der Datenbank
    - Ich tippe oben rechs auf den ScanButton - scan den BarCode - lande dann im View mit dem DatePicker
    - Wenn ich aber dann oben rechts auf den haken tippe, sollte normalerweise dieser BarCode in die DB geschrieben werden und der TableView wieder erscheinen.

    Leider stürzt die App nach tippen des Haken im super.viewDidload() bei self.DatenAbrufen() ab
    Fehlermeldung:

    fatal error: unexpectedly found nil while unwrapping an Optional value

    habe jetzt mehrer stunden porbiert und getan und weiß leoder nicht mehr weiter.
    hoffe ihr könnt mir helfen
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ghost108 ()

  • Das ein value unerwartet Nil ist ?
    woher weiß ich denn welches value gemeint ist?

    noch eine andere Frage:
    warum steht mit der Wert der Variable detectionString aus func StartScan nicht mehr in der func ScanFertigstellen zur Verfügung?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Ghost108 ()

  • Mal ne ganz andere Frage: warum nennst du das Thema " Meine erste App, deren Fehler und Optimierungen " und machst dann für jeden Fehler noch nen eigenen Thread? Kann verstehen dass es dann übersichtlicher ist für dich aber dann nenn ich den Thread nicht so.

    Nicht böse gemeint. Nicht das du das falsch verstehst.

    Gruß,
    cranyk
    „Wer immer tut, was er schon kann, bleibt immer das, was er schon ist.“
    Henry Ford
  • Ghost108 schrieb:

    weil komischerweise darauf keiner mehr Antwortet.
    Was erwartest Du denn? Das sich jemand Dein Storyboard anguckt, ein Review drüber macht und Dir Verbesserungsvorschläge liefert. Sorry, aber da ist meine Zeit mir zu Schade dafür.

    Konkrekte Frage -> konkrete Antwort. Aber das was Du oben formuliert hast geht ja schon Richtung Consulting, da verlange ich normalerweise Geld für :D

    ciao

    gandhi
  • schau dir Post 5 an?
    Erwarte ich da Verbesserungsvorschläge o.ä.?

    Habe da zwei Probleme aufgelistet - mehr nicht.
    Möchte aber deine kostbare Zeit nicht in Anspruch nehmen - keine sorge
  • unexpected nil value... also Du wilts auf Daten zugreifen, aber die sind entgegen Deiner Erwartung nil. Da sollte Dir der Debugger hinspringen, dafür musst Du einen break bei Exceptions einbauen. Dann kannst DU ziemlich genau angeben, in welcher Zeile das passiert und was nil ist. Und dann lässt es sich Vl.. erklären.

    Warum variablen nicht mehr zur Verfügung stehen lässt sich ganz oben Code nicht sagen. Am besten mal in extra Fragen stecken und nötiger Informationen mit dazu packen... ansonsten müssen wir hier ne Glaskugel auspacken... und das ist leider nun mal reine Zeitverschwendung

    volker
  • Ghost108 schrieb:


    noch eine andere Frage:
    warum steht mit der Wert der Variable detectionString aus func StartScan nicht mehr in der func ScanFertigstellen zur Verfügung?
    Woher sollen wir das ohne Code wissen? Vielleicht weil es keine Instanzvariable ist, weil Du sie nicht als Parameter mitgibst, weil ... alles pure Spekulation.

    Verwende bitte etwas mehr Sorgfalt beim Schreiben Deiner Fragen und einen anderen Ton, wenn Dich Leute darauf hinweisen, dass Du etwas an Deinem Auftreten hier arbeiten solltest. Ein Forum ist keine Einbahnstrasse, und wenn Du vielleicht (noch) nicht anderen mit Rat zur Seite stehen kannst, solltest Du zumindest den Respekt vor der Zeit anderer Leute haben, um Fragestellungen sauber und mit allen notwendigen Informationen zu schreiben ... und Antworten als Denkanstoß verwenden.

    Nur ein gut gemeinter Rat,

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • gritsch schrieb:

    kmr schrieb:

    Ghost108 schrieb:

    fatal error: unexpectedly found nil while unwrapping an Optional value
    Was könnte Dir der Compiler denn mit dieser Nachricht sagen wollen?
    obj-c zu verwenden ;)
    Es gibt keine Laufzeitfehler mit Swift! Das ist ein klassischer Objective-C-Fehler, den Swift endgültig beseitigt hat. So wie der Kommunismus die Ungleichheit der Menschen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • ich lese nebenbei das ebook von Apple.
    allerdings kommen beim lesen auch einige Fragen auf, wie z.B. das übergeben einer Variable an einer Func aus einer Func
    Von euch wurde mir die inout Variante vorgeschlagen.
    Die habe ich nachgelesen und im Playground erfolgreich durchführen können:



    Teste aktuell im PlayGround und das klappt auch.

    C-Quellcode

    1. //: Playground - noun: a place where people can play
    2. import UIKit
    3. var zahl:Int = 0
    4. func getZahl(inout zahl: Int) {
    5. zahl = 11111001
    6. }
    7. getZahl(&zahl)
    8. func ChangeZahl(inout zahl: Int) {
    9. zahl + 15
    10. }
    11. ChangeZahl(&zahl)
    12. ´
    Alles anzeigen


    aber ich bekomme das nicht in meinem eigentlich code untergebracht:


    C-Quellcode

    1. //
    2. // ViewController.swift
    3. // Test
    4. //
    5. // Copyright (c) 2015 by Ghost108. All rights reserved.
    6. //
    7. import UIKit
    8. import AVFoundation
    9. import Foundation
    10. class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AVCaptureMetadataOutputObjectsDelegate {
    11. @IBOutlet weak var LebensmittelTable: UITableView!
    12. @IBOutlet weak var NavBarLM: UINavigationItem!
    13. let session : AVCaptureSession = AVCaptureSession()
    14. let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    15. var previewLayer : AVCaptureVideoPreviewLayer!
    16. var highlightView : UIView = UIView()
    17. var detectionString : String!
    18. /*************** VIEW DID LOAD ***************/
    19. override func viewDidLoad() {
    20. super.viewDidLoad()
    21. // Button Scan einblenden
    22. var imageViewright:UIImageView = UIImageView()
    23. imageViewright.frame = CGRectMake(0, 0, 26, 26)
    24. var rightImage:UIImage = UIImage(named: "barcode")!
    25. imageViewright.image = rightImage
    26. var rightView:UIView = UIView()
    27. rightView.frame = CGRectMake(0, 0, 26, 26)
    28. rightView.addSubview(imageViewright)
    29. var rightGestureRecognizer:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "StartScan")
    30. rightView.addGestureRecognizer(rightGestureRecognizer)
    31. var righttem:UIBarButtonItem = UIBarButtonItem()
    32. righttem.customView = rightView
    33. self.navigationItem.rightBarButtonItem = righttem
    34. righttem.tintColor = UIColor.whiteColor()
    35. }
    36. /*************** SCAN ***************/
    37. func StartScan() {
    38. self.highlightView.autoresizingMask = .FlexibleTopMargin | .FlexibleBottomMargin | .FlexibleLeftMargin | .FlexibleRightMargin
    39. self.highlightView.layer.borderColor = UIColor.greenColor().CGColor
    40. self.highlightView.layer.borderWidth = 3
    41. self.view.addSubview(self.highlightView)
    42. var error : NSError? = nil
    43. let input : AVCaptureDeviceInput? = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
    44. if input != nil {
    45. session.addInput(input)
    46. }
    47. let output = AVCaptureMetadataOutput()
    48. output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
    49. session.addOutput(output)
    50. output.metadataObjectTypes = output.availableMetadataObjectTypes
    51. previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
    52. previewLayer.frame = self.view.bounds
    53. previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    54. self.view.layer.addSublayer(previewLayer)
    55. session.startRunning()
    56. }
    57. /*************** BARCODE SUCHEN ***************/
    58. func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    59. var highlightViewRect = CGRectZero
    60. var barCodeObject : AVMetadataObject!
    61. let barCodeTypes = [
    62. AVMetadataObjectTypeUPCECode,
    63. AVMetadataObjectTypeCode39Code,
    64. AVMetadataObjectTypeCode39Mod43Code,
    65. AVMetadataObjectTypeEAN13Code,
    66. AVMetadataObjectTypeEAN8Code,
    67. AVMetadataObjectTypeCode93Code,
    68. AVMetadataObjectTypeCode128Code,
    69. AVMetadataObjectTypePDF417Code,
    70. AVMetadataObjectTypeQRCode,
    71. AVMetadataObjectTypeAztecCode,
    72. AVMetadataObjectTypeITF14Code,
    73. AVMetadataObjectTypeInterleaved2of5Code,
    74. AVMetadataObjectTypeFace,
    75. AVMetadataObjectTypeDataMatrixCode
    76. ]
    77. for metadata in metadataObjects {
    78. for barcodeType in barCodeTypes {
    79. if metadata.type == barcodeType {
    80. barCodeObject = self.previewLayer.transformedMetadataObjectForMetadataObject(metadata as! AVMetadataMachineReadableCodeObject)
    81. highlightViewRect = barCodeObject.bounds
    82. detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue
    83. self.session.stopRunning()
    84. self.previewLayer.removeFromSuperlayer()
    85. break
    86. }
    87. }
    88. }
    89. }
    90. /*************** BUTTON SCAN SAVE ***************/
    91. @IBAction func ScanFertigstellen(sender: AnyObject) {
    92. func getCode(inout detectionString: String) {
    93. var eancode = detectionString
    94. println("\(eancode)")
    95. }
    96. }
    97. }
    Alles anzeigen




    Ich hatte in der func captureOutput inout detectionString: String hinzugefügt
    Danach funktionierte das Scannen das Barcodes nicht mehr.
  • was für ein Buch wäre denn zu empfehlen?

    @MCDan
    zumindest funktioniert der Code so, solang ich das inout weg lasse ...



    * UPDATE *

    Habe den Code mal wie folgt angepasst:

    C-Quellcode

    1. //
    2. // ViewController.swift
    3. // Test
    4. //
    5. // Copyright (c) 2015 by Ghost108. All rights reserved.
    6. //
    7. import UIKit
    8. import AVFoundation
    9. import Foundation
    10. import CoreData
    11. class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AVCaptureMetadataOutputObjectsDelegate {
    12. @IBOutlet weak var LebensmittelTable: UITableView!
    13. @IBOutlet weak var NavBarLM: UINavigationItem!
    14. let session : AVCaptureSession = AVCaptureSession()
    15. let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    16. let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    17. var previewLayer : AVCaptureVideoPreviewLayer!
    18. var highlightView : UIView = UIView()
    19. var detectionString : String! = ""
    20. /*************** VIEW DID LOAD ***************/
    21. override func viewDidLoad() {
    22. super.viewDidLoad()
    23. // Button Scan einblenden
    24. var imageViewright:UIImageView = UIImageView()
    25. imageViewright.frame = CGRectMake(0, 0, 26, 26)
    26. var rightImage:UIImage = UIImage(named: "barcode")!
    27. imageViewright.image = rightImage
    28. var rightView:UIView = UIView()
    29. rightView.frame = CGRectMake(0, 0, 26, 26)
    30. rightView.addSubview(imageViewright)
    31. var rightGestureRecognizer:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "StartScan")
    32. rightView.addGestureRecognizer(rightGestureRecognizer)
    33. var righttem:UIBarButtonItem = UIBarButtonItem()
    34. righttem.customView = rightView
    35. self.navigationItem.rightBarButtonItem = righttem
    36. righttem.tintColor = UIColor.whiteColor()
    37. }
    38. /*************** SCAN ***************/
    39. func StartScan() {
    40. self.highlightView.autoresizingMask = .FlexibleTopMargin | .FlexibleBottomMargin | .FlexibleLeftMargin | .FlexibleRightMargin
    41. self.highlightView.layer.borderColor = UIColor.greenColor().CGColor
    42. self.highlightView.layer.borderWidth = 3
    43. self.view.addSubview(self.highlightView)
    44. var error : NSError? = nil
    45. let input : AVCaptureDeviceInput? = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
    46. if input != nil {
    47. session.addInput(input)
    48. }
    49. let output = AVCaptureMetadataOutput()
    50. output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
    51. session.addOutput(output)
    52. output.metadataObjectTypes = output.availableMetadataObjectTypes
    53. previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer
    54. previewLayer.frame = self.view.bounds
    55. previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    56. self.view.layer.addSublayer(previewLayer)
    57. session.startRunning()
    58. }
    59. /*************** BARCODE GEFUNDEN ***************/
    60. func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    61. func getEAN (inout detectionString: String) {
    62. var highlightViewRect = CGRectZero
    63. var barCodeObject : AVMetadataObject!
    64. let barCodeTypes = [
    65. AVMetadataObjectTypeUPCECode,
    66. AVMetadataObjectTypeCode39Code,
    67. AVMetadataObjectTypeCode39Mod43Code,
    68. AVMetadataObjectTypeEAN13Code,
    69. AVMetadataObjectTypeEAN8Code,
    70. AVMetadataObjectTypeCode93Code,
    71. AVMetadataObjectTypeCode128Code,
    72. AVMetadataObjectTypePDF417Code,
    73. AVMetadataObjectTypeQRCode,
    74. AVMetadataObjectTypeAztecCode,
    75. AVMetadataObjectTypeITF14Code,
    76. AVMetadataObjectTypeInterleaved2of5Code,
    77. AVMetadataObjectTypeFace,
    78. AVMetadataObjectTypeDataMatrixCode
    79. ]
    80. for metadata in metadataObjects {
    81. for barcodeType in barCodeTypes {
    82. if metadata.type == barcodeType {
    83. barCodeObject = self.previewLayer.transformedMetadataObjectForMetadataObject(metadata as! AVMetadataMachineReadableCodeObject)
    84. highlightViewRect = barCodeObject.bounds
    85. detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue
    86. self.session.stopRunning()
    87. self.previewLayer.removeFromSuperlayer()
    88. println ("Scan: \(detectionString)")
    89. break
    90. }
    91. }
    92. }
    93. }
    94. getEAN(&detectionString!)
    95. }
    96. /*************** BUTTON SCAN SAVE ***************/
    97. @IBAction func ScanFertigstellen(sender: AnyObject) {
    98. func getCode(inout detectionString: String) {
    99. var eancode = detectionString
    100. println("Code: \(eancode)")
    101. }
    102. getCode(&detectionString!)
    103. }
    104. }
    Alles anzeigen

    Resultat:

    Zeile 147 gibt mir den gescannten Code aus.
    Zeile 162: gibt nur Code: aus ohne EAN Code

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ghost108 ()