UIActivityIndicatorView始终显示
问题描述:
UIActivityIndicatorView
始终显示在我的应用程序中。UIActivityIndicatorView始终显示
我正在斯威夫特应用,我想使系统在我的应用程序,它上传图像到我的Django的服务器。我的目标是当我选择图像,然后点击发送按钮发送图像到服务器,UIActivityIndicatorView
出现并滚动。但现在UIActivityIndicatorView
已经显示在选择图像之前。
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
部分。
希望这可以帮助:-))