ios - UIActivityIndi​​catorView 始终显示

标签 ios swift

UIActivityIndi​​catorView 始终显示在我的应用程序中。

我正在制作Swift应用程序,我想在我的应用程序中制作一个系统,将图像上传到我的Django服务器。我的目标是当我选择图像并点击将图像发送到服务器的发送按钮时,UIActivityIndi​​catorView出现并滚动。但是现在UIActivityIndi​​catorView code> 在选择图像之前已经显示。

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

为什么总是显示UIActivityIndi​​catorView?如何制作我理想的应用程序?我应该添加什么代码?

最佳答案

除非您设置 hidesWhenStopped 属性,否则您的 activityIndi​​cator 将始终可见。

To automatically hide the activity indicator when animation stops, set the hidesWhenStopped property to true.

您可以在 viewDidLoad 函数或 Storyboard 中设置此值。

myActivityIndicator.hidesWhenStopped = true

因此,每当您调用 myActivityIndi​​cator.stopAnimating = true 时,都会触发 hidesWhenStopped

关于ios - UIActivityIndi​​catorView 始终显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44579132/

相关文章:

ios - 如何更改 UIActivityViewController 中的项目位置

json - 如何使用 Alamofire 发布嵌套的 JSON?

swift - 以下语法是否适合解析 Swift

ios - HKWorkoutSession 中的心率数据是移动平均值吗?

ios - MPMoviePlayerController 错误 URL 错误

ios - 如何使用 realm.addNotificationBlock?

ios - 如何修复 Application Loader Error : Invalid Bundle. The bundle ... contains disallowed file 'Frameworks'

ios - 如何在 UITextField 的 shouldChangeCharactersIn 中有效地处理多个文本字段

ios - 在 Swift 中为单个 View 自定义导航栏背景?

iOS - 无法从其数据源获取单元格