2017-06-16 124 views
0

UIActivityIndicatorView始終顯示在我的應用程序中。UIActivityIndi​​catorView始終顯示

我正在斯威夫特應用,我想使系統在我的應用程序,它上傳圖像到我的Django的服務器。我的目標是當我選擇圖像,然後點擊發送按鈕發送圖像到服務器,UIActivityIndicatorView出現並滾動。但現在UIActivityIndicatorView已經顯示在選擇圖像之前。

my app when I run

my app when I select image

import Foundation 

import MobileCoreServices 

import UIKit 

class PhotoController:UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate{  

    @IBOutlet weak var myActivityIndicator: UIActivityIndicatorView! 

    @IBOutlet weak var label: UILabel! 

    @IBOutlet weak var myImageView: UIImageView! 

    private var imagePicker:UIImagePickerController! 



    @IBAction func uploadButtonTapped(_ sender: Any) { 

     myImageUploadRequest() 

    } 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     label.adjustsFontSizeToFitWidth = true 

     label.minimumScaleFactor = 0.5 

     label.text = "Tap the PhotoSelect or Camera to upload a picture" 

    } 

    @IBAction func PhotoSelect(_ sender: Any) { 

     let myPickerController = UIImagePickerController() 

     myPickerController.delegate = self; 

     myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary 

     self.present(myPickerController, animated: true, completion: nil) 
    } 

    @IBAction func Camera(_ sender: Any) { 

     let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.camera 

     // カメラが利用可能かチェック 

     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){ 

      // インスタンスの作成 

      let cameraPicker = UIImagePickerController() 

      cameraPicker.sourceType = sourceType 

      cameraPicker.delegate = self 

      self.present(cameraPicker, animated: true, completion: nil) 



     } 

     else{ 

      label.text = "error"  

     } 

    } 

    // 撮影が完了時した時に呼ばれる 

    func imagePickerController(_ imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 

      myImageView.contentMode = .scaleAspectFit 

      myImageView.image = pickedImage 
     } 

     //閉じる処理 

     imagePicker.dismiss(animated: true, completion: nil) 

     label.text = "Tap the Send to save a picture" 



    } 

    // 撮影がキャンセルされた時に呼ばれる 

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 

     picker.dismiss(animated: true, completion: nil) 

     label.text = "Canceled" 

    } 
    override func didReceiveMemoryWarning() { 

     super.didReceiveMemoryWarning() 

     // Dispose of any resources that can be recreated. 

    } 
    func myImageUploadRequest() 

    { 
     let myUrl = NSURL(string: "http://localhost:8000/admin/accounts/post/"); 
     let request = NSMutableURLRequest(url:myUrl! as URL); 

     request.httpMethod = "POST"; 

     //ユーザーごとに割り振りたい 

     let param = [ 

      "firstName" : "Sergey", 

      "lastName" : "Kargopolov", 

      "userId" : "9" 

     ] 
     let boundary = generateBoundaryString() 
     request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 
     guard let myImage = myImageView.image else { 

      return 

     } 

     let imageData = UIImageJPEGRepresentation(myImageView.image!, 1) 
     if(imageData==nil) { return; } 
     request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file", imageDataKey: imageData! as NSData, boundary: boundary) as Data 

     myActivityIndicator.startAnimating(); 



     let task = URLSession.shared.dataTask(with: request as URLRequest) { 

      data, response, error in 



      if error != nil { 

       print("error=\(error)") 

       return 

      } 

      // You can print out response object 

      print("******* response = \(response)") 
      // Print out reponse body 

      let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 

      print("****** response data = \(responseString!)") 
      do { 

       let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary 
       DispatchQueue.main.async { 

        self.myActivityIndicator.stopAnimating() 

        self.myImageView.image = nil; 

       } 
      }catch 

      { 

       print(error) 

      }  

     } 

     task.resume() 

    } 

    func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData { 

     let body = NSMutableData(); 
     if parameters != nil { 

      for (key, value) in parameters! { 

       body.appendString(string: "--\(boundary)\r\n") 

       body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 

       body.appendString(string: "\(value)\r\n") 

      } 

     } 
     let filename = "user-profile.jpg" 
     let mimetype = "image/jpg" 
     body.appendString(string: "--\(boundary)\r\n") 

     body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n") 

     body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n") 
     body.append(imageDataKey as Data) 
     body.appendString(string: "\r\n") 
     body.appendString(string: "--\(boundary)--\r\n") 
     return body 
    } 

    func generateBoundaryString() -> String { 

     return "Boundary-\(NSUUID().uuidString)" 
    } 
} 

extension NSMutableData { 
    func appendString(string: String) { 

     let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true) 

     append(data!) 

    } 

} 

我實在不明白爲什麼會這樣,我在我的代碼

myActivityIndicator.startAnimating(); 

self.myActivityIndicator.stopAnimating() 

寫道爲什麼UIActivityIndicatorView總是表現?我如何製作理想的應用程序?我應該添加一些代碼?

回答

0

activityIndicator將永遠是可見的,除非你設置hidesWhenStopped屬性。

要在動畫停止時自動隱藏活動指示符,請將的hidesWhenStopped屬性設置爲true。

您可以在您的viewDidLoad函數或故事板中設置此值。

myActivityIndicator.hidesWhenStopped = true 

所以每當你打電話myActivityIndicator.stopAnimating = true然後hidesWhenStopped將被觸發。

0

你忘了在viewDidLoad()添加此屬性:

myActivityIndicator.hidesWhenStopped = true 

您還可以設置這個在故事板Attributes Inspector/Activity Indicator View部分。

希望這可以幫助:-))

0

您必須設置UIActivityIndicatorView的屬性,即hidesWhenStoppedtrue

您可以以編程方式或在storyboard中設置屬性。

解決方案1:

enter image description here

解決方案2:

viewdidload添加這一行,

myActivityIndicator.hidesWhenStopped = true 
相關問題