2017-06-16 4 views
0

UIActivityIndicatorView wird immer in meiner App angezeigt.UIActivityIndicatorView wird immer angezeigt

Ich mache Swift App und ich möchte ein System, in meiner app machen, die ein Bild zu meinem Django-Server hochladen. Mein Ziel ist es zu machen, wenn ich Bild wähle und ich tippe Send button, die Bilder an den Server senden, UIActivityIndicatorView ist erschienen und rollte.Aber jetzt ist UIActivityIndicatorView bereits vor der Auswahl Bild angezeigt.

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!) 

    } 

} 

Ich kann wirklich nicht verstehen, warum dies geschieht, schrieb ich in meinem Code

myActivityIndicator.startAnimating(); 

self.myActivityIndicator.stopAnimating() 

Warum ist UIActivityIndicatorView immer zeigte? Wie kann ich meine ideale App erstellen? Was soll ich Code hinzufügen?

Antwort

0

Ihre activityIndicator wird immer sichtbar sein, wenn Sie das hidesWhenStopped Attribut gesetzt.

Um automatisch die Aktivitätsanzeige ausblenden, wenn Animation stoppt, setzen die hidesWhenStopped Eigenschaft auf true.

Sie können diesen Wert entweder in Ihrer viewDidLoad Funktion oder in Ihrem Storyboard einstellen.

myActivityIndicator.hidesWhenStopped = true 

Also, wenn Sie rufen myActivityIndicator.stopAnimating = true dann hidesWhenStopped ausgelöst werden.

0

Sie haben vergessen, dieses Attribut in viewDidLoad() hinzuzufügen:

myActivityIndicator.hidesWhenStopped = true 

Sie auch diese im Attributes Inspector/Activity Indicator View Abschnitt in der Storyboard einstellen.

Hope this :-) helfen kann)

0

Sie müssen die Eigenschaft von UIActivityIndicatorView, d. H. hidesWhenStopped auf true setzen.

Sie können die Eigenschaft entweder programmgesteuert oder unter storyboard festlegen.

Lösung 1:

enter image description here

Lösung 2:

In viewdidload fügen Sie diese Zeile,

myActivityIndicator.hidesWhenStopped = true 
Verwandte Themen