UIActivityIndi​​catorView始终显示

UIActivityIndi​​catorView始终显示

问题描述:

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总是表现?我如何制作理想的应用程序?我应该添加一些代码?

activityIndicator将永远是可见的,除非你设置hidesWhenStopped属性。

要在动画停止时自动隐藏活动指示符,请将的hidesWhenStopped属性设置为true。

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

myActivityIndicator.hidesWhenStopped = true 

所以每当你打电话myActivityIndicator.stopAnimating = true然后hidesWhenStopped将被触发。

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

myActivityIndicator.hidesWhenStopped = true 

您还可以设置这个在故事板Attributes Inspector/Activity Indicator View部分。

希望这可以帮助:-))

您必须设置UIActivityIndicatorView的属性,即hidesWhenStoppedtrue

您可以以编程方式或在storyboard中设置属性。

解决方案1:

enter image description here

解决方案2:

viewdidload添加这一行,

myActivityIndicator.hidesWhenStopped = true