2017-03-28 8 views
0

私は、ストーリーボードに接続されているSettingsviewcontroller.swiftファイルとconnectionapi.swiftという別のファイルを持っています。別のSwiftクラスとファイルからの警告をユーザーに通知する方法

ユーザーがチェックボタンをクリックすると、指定したユーザー名とパスワードがconnectionapiクラスのAPIと照合されます。瞬時に結果がエラーを生成すると、私はユーザーに警告メッセージを通知します。私はこれを行う方法を数日見つけることを試みているが、私はそれを見つけるように見えることができません。私は間違いで終わる。

誰かがいくつかのコード例で私を助けてください:

viewcontrolerファイル

// 
// ViewControllerSettings.swift 
// 

import Foundation 
import UIKit 


class ViewControllerSettings: UIViewController { 
    @IBOutlet weak var tGebruikersnaam: UITextField! 
    @IBOutlet weak var tCode: UITextField! 
    @IBOutlet weak var AnimatedImage: UIImageView! 
    @IBOutlet weak var lCopyright: UILabel! 
    @IBOutlet weak var lStatus: UILabel! 


    // declare a iCloud Store to save and load data from 
    var iCloudStore:NSUbiquitousKeyValueStore! 
    var userName:String = "" 
    var password:String = "" 

    let API = myAPI() 


    @IBAction func didTapOpslaan(_ sender: Any) { 
     if tGebruikersnaam.text == "" || tGebruikersnaam.text == nil || tCode.text == "" || tCode.text == nil { 
      return 
     } 

     print("Lets check username and password against the api") 

     let newUsername = "\(tGebruikersnaam.text!)" 
     let newCode = "\(tCode.text!)" 




     API.CheckUsernamePassword(username: newUsername, code: newCode) { 
      isValid in 
      print(isValid) 

      if isValid == true { 

       DispatchQueue.main.async { 
        print("The credentials are correct") 
        self.ShowAnimationOk() 
       } 
      }else { 
       DispatchQueue.main.async { 
        print("the credentials are wrong") 
        self.ShowAnimationNo() 
       } 
      } 


     } 

    } 

// Code removed  

} 

APIスウィフトファイル

// 
// ConnectAPI.swift 


import Foundation 
import UIKit 




class myAPI{ 

    let api_key = "b88a734f186sad" 
    let baseurl = "https://xxxx:443/xxxx/api" 

    func CheckUsernamePassword(username :String ,code:String, completion: @escaping (Bool)->()) { 


     let urlString = "\(self.baseurl)/accounts/validateusernamepassword.json?username=\(username)&password=\(code)&api_key=\(self.api_key)" 

     let url = URL(string: urlString) 
     URLSession.shared.dataTask(with:url!) { (data, response, error) in 
      if error != nil { 
       print("API | Error URLSession : \(error!)") 
       completion(false) 
      } else { 
       do { 
        let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 

        print("----------") 


        if parsedData["validated"] != nil { 
         if "\(parsedData["validated"]!)" == "1" { 
          print("API JSON | validated = \(parsedData["validated"]!)") 
          print("API JSON | message = \(parsedData["message"]!)") 
          completion(true) 

         }else { 
          print("Credential Check not valid") 
          print("API JSON | validated = \(parsedData["validated"]!)") 
          print("API JSON | message = \(parsedData["message"]!)") 
          completion(false) 

         } 


        }else{ 
         print("Json Parse error: \(parsedData)") 

         // Raise a Alert here 
        } 


       } catch let error as NSError { 
        print("API | Error Parsing JSON \(error)") 


         // Raise a Alert here 
         // main.showAlert(message: "API | Error Parsing JSON \(error)") 

         //A error occured when checking credentials, try again later. 

        completion(false) 
       } 
      } 

      }.resume() 

    } 
+0

あなたは何のエラーを得るのですか?あなたの現在のコードではうまくいかないのですか?完了ブロックは実行中ですか? – dirkgroten

答えて

0

を私はあなただかわからないんだけど問題はです。あなたは ViewControllerSettingsクラスにあなたのAPIクラスからエラーメッセージを渡す方法がわからない

  1. :私はあなたが二つの問題を持っていることを前提としています。
  2. あなたがその場合は

前のiOSに警告を表示する方法がわからない、のは、これを見てみましょう。


1.あなたが見ることができ、エラーメッセージ

を渡すこと完了ブロック(例えば、@escaping(ブール値) - >())関数はURLSessionのdataTaskで行わcheckUsernamePassword後に呼び出されます:

func CheckUsernamePassword(username :String ,code:String, completion: @escaping (Bool)->()) { ... } 

成功した場合は、真の値とのブロックを呼び出す

completion(true) 
あなたはより多くの情報(例えばを渡すには値をfalse

completion(false) 

を呼び出して、他の例では3210

エラーメッセージ)、入力パラメータを補完ブロックに追加するだけです。それぞれの名前を追加すると、より明確になります。例えば、それを変更します。

completion(valid: true, errorMessage: nil) 

そして、それは誤りだ場合、あなたはあなた自身のエラーメッセージのいずれかを渡したり、NSErrorからそれを得る:APIが成功した場合、あなたはにErrorMessageせずにそれを呼び出す、その後

..., completion: @escaping (valid: Bool, errorMessage: String?) ->()) 

completion(valid: false, errorMessage: "Credential check not valid.") 

2。(ViewControllerをを)あなたが最初のステップを行った場合は、呼び出しサイトであなたのエラーメッセージにアクセスした

// Simple Alert UI 
func showAlert(title: String, message: String) { 
    let actionSheetController: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 

    // add close button 
    let cancelAction: UIAlertAction = UIAlertAction(title: "Close", style: .cancel) { _ in } 
    actionSheetController.addAction(cancelAction) 

    // show on self 
    self.present(actionSheetController, animated: true, completion: nil) 
} 

:UIAlertControllerにエラーを表示すること

まずあなたViewControllerSettingsで標準のアラートを表示するユーティリティ関数を作ります。

あなたはAPIを呼び出すと、にErrorMessageが利用可能な、ただの警告でそれを示しています。

// didTap... 
API.CheckUsernamePassword(username: newUsername, code: newCode) { 
    (isValid, errorMessage) in 
    if isValid { 
     ... 
    } else { 
     let error = errorMessage! // I don't recommend forced-casting though 
     self.showAlert(title: "Error!", message: error) // show Alert UI 
    } 
} 
関連する問題