Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UITableViewCell中显示多个图像上载的进度指示器_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 在UITableViewCell中显示多个图像上载的进度指示器

Ios 在UITableViewCell中显示多个图像上载的进度指示器,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有自定义单元格的UITableView。我想显示多个图像上传的进度指示器 我尝试过UITableView的重载rowatindexpath方法,但这并不是足够的解决方案,因为单元格不断闪烁,看起来很奇怪 我发现的另一个解决方案是将我的进度指标视图的引用存储在全局变量的UITableViewCell中,然后在UITableView数据源方法之外修改它,但在这个解决方案中,我遇到了一个问题,那就是我必须跟踪UITableViewCell的多个进度指示器视图对象,这是很困难的,因为UITableVi

我有自定义单元格的UITableView。我想显示多个图像上传的进度指示器

我尝试过UITableView的重载rowatindexpath方法,但这并不是足够的解决方案,因为单元格不断闪烁,看起来很奇怪

我发现的另一个解决方案是将我的进度指标视图的引用存储在全局变量的UITableViewCell中,然后在UITableView数据源方法之外修改它,但在这个解决方案中,我遇到了一个问题,那就是我必须跟踪UITableViewCell的多个进度指示器视图对象,这是很困难的,因为UITableView数据源是二维NSMutableArrayIn数组中的短数组,所以由于有多个节,我没有唯一的indexath.row。那么,如何管理进度指示器视图的对象呢


还有没有更好的解决方案来做这类工作?

好的,下面是我在一个项目中找不到其他东西时使用的方法

斯威夫特3

创建NSObject的子类,因为URLSession的子类不允许您将配置和其他参数设置为唯一指定的初始值设定项。init包含启动上载过程的单元格的信息(如IndexPath中所示)以及URLSession对象

每当您想要上传我使用的URLSession的uploadTask方法时,使用这个子类来创建新的URLSession

创建uploadTask并开始上载

您还必须创建自己的协议方法,这些方法由URLSession的常规协议方法调用,以便将自定义子类而不是URLSession对象发送给所需的代理

然后,在该委托中,您可以检查从上一步获得的自定义子类中存储的indexPath信息,并更新相应的单元格

我想通过使用通知也可以实现同样的效果

下面是我编写的示例应用程序的屏幕截图:


欢迎编辑。

好的,下面是我在一个项目中找不到其他内容时使用的内容

斯威夫特3

创建NSObject的子类,因为URLSession的子类不允许您将配置和其他参数设置为唯一指定的初始值设定项。init包含启动上载过程的单元格的信息(如IndexPath中所示)以及URLSession对象

每当您想要上传我使用的URLSession的uploadTask方法时,使用这个子类来创建新的URLSession

创建uploadTask并开始上载

您还必须创建自己的协议方法,这些方法由URLSession的常规协议方法调用,以便将自定义子类而不是URLSession对象发送给所需的代理

然后,在该委托中,您可以检查从上一步获得的自定义子类中存储的indexPath信息,并更新相应的单元格

我想通过使用通知也可以实现同样的效果

下面是我编写的示例应用程序的屏幕截图:


欢迎编辑。

这里我应用的解决方案可能对那些希望实现与我相同的实现而不使用第三方库或类的人有所帮助

我使用CALayer和一些动画创建了一个自定义UIView和design循环进度指示器。这没什么大不了的。但对我来说困难的是,我希望这个进度指示器在几个单元格中,以百分比表示多个图像的进度

因此,我创建了一个具有如下属性的自定义类

@property (nonatomic,retain) NSIndexPath              *indexPath;
@property (nonatomic,strong) NSURLSessionTask         *uploadtask;

然后我维护一个NSMutableArray,其中包含我的自定义类对象,该类对象具有用于当前上载图像的每个uploadTask的值,以及包含indexPath的合并字符串。现在我跟踪了我所有上传的图像,因此每当我收到NSURLSession的委托方法的响应时,我都会借助indexPath值在我的自定义进度指示器UIView中更改上传百分比。

这里我应用的解决方案可能对那些想要与我相同的实现的人有所帮助,不使用第三方库或类

我使用CALayer和一些动画创建了一个自定义UIView和design循环进度指示器。这没什么大不了的。但对我来说困难的是,我希望这个进度指示器在几个单元格中,以百分比表示多个图像的进度

因此,我创建了一个具有如下属性的自定义类

@property (nonatomic,retain) NSIndexPath              *indexPath;
@property (nonatomic,strong) NSURLSessionTask         *uploadtask;
然后我维护一个NSMutableArray,其中包含我的自定义类对象,该类对象具有用于当前上载图像的每个uploadTask的值,以及包含indexPath的合并字符串。现在我已经跟踪了所有上传的图像,因此每当我收到NSURLSession的委托方法的响应时,我都会借助indexPath值在自定义进度指示器UIView中更改上传百分比。

使用 URLSessionTaskDelegate方法并进行必要的计算:

func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)

使用URLSessionTaskDelegate方法并进行必要的计算:

func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)

我有一个类似的事情要做,我想在哪里下载文件和显示进度条。我的想法是创建一个自定义对象来跟踪特定的下载,所有的单元都会在内部监听这个对象中的变化。每个单元都有自己的对象,该对象由任务标识符唯一标识。我已经在Swift 3中编写了一个示例代码,下面还添加了链接骨架代码


我有一个类似的事情要做,我想在哪里下载文件和显示进度条。我的想法是创建一个自定义对象来跟踪特定的下载,所有的单元都会在内部监听这个对象中的变化。每个单元都有自己的对象,该对象由任务标识符唯一标识。我已经在Swift 3中编写了一个示例代码,下面还添加了链接骨架代码


下面是一个解决方案,针对单个文件上载进行了测试。但您可以修改它以支持多个文件上载。确保根据需要添加必要的IBOutlets和IBAction。图像添加到“Assets.xcsets”中

我的UI如下所示:

下面是ViewController的代码

import UIKit

class UploadProgressViewController: UIViewController, URLSessionTaskDelegate {

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var progressView: UIProgressView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    progressView.progress = 0.0
}

@IBAction func didTapOnStartUploadButton(_ sender: Any) {
    startDownload()
}

func startDownload () {
    // 1. Prepare data to download
    var data = Data()
    if let image = UIImage(named: "swift.jpg") {
        data = image.pngData()!
    }
    // 2. Creation of request
    var request = URLRequest(url: NSURL(string: "http://127.0.0.1:8000/swift.png")! as URL)
    request.httpMethod = "POST"
    request.setValue("Keep-Alive", forHTTPHeaderField: "Connection")
    // 3. Configuring the Session
    let configuration = URLSessionConfiguration.default
    let mainqueue = OperationQueue.main
    // 4. Start the upload task
    let session = URLSession(configuration: configuration, delegate:self, delegateQueue: mainqueue)
    let dataTask = session.uploadTask(with: request, from: data)
    dataTask.resume()
}

// URLSessionTaskDelegate Handling

func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
    let uploadProgress: Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
    print("session \(session) uploaded \(uploadProgress * 100)%.")
    progressView.progress = uploadProgress
}

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    print(error.debugDescription)
}

下面是一个解决方案,针对单个文件上载进行了测试。但您可以修改它以支持多个文件上载。确保根据需要添加必要的IBOutlets和IBAction。图像添加到“Assets.xcsets”中

我的UI如下所示:

下面是ViewController的代码

import UIKit

class UploadProgressViewController: UIViewController, URLSessionTaskDelegate {

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var progressView: UIProgressView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    progressView.progress = 0.0
}

@IBAction func didTapOnStartUploadButton(_ sender: Any) {
    startDownload()
}

func startDownload () {
    // 1. Prepare data to download
    var data = Data()
    if let image = UIImage(named: "swift.jpg") {
        data = image.pngData()!
    }
    // 2. Creation of request
    var request = URLRequest(url: NSURL(string: "http://127.0.0.1:8000/swift.png")! as URL)
    request.httpMethod = "POST"
    request.setValue("Keep-Alive", forHTTPHeaderField: "Connection")
    // 3. Configuring the Session
    let configuration = URLSessionConfiguration.default
    let mainqueue = OperationQueue.main
    // 4. Start the upload task
    let session = URLSession(configuration: configuration, delegate:self, delegateQueue: mainqueue)
    let dataTask = session.uploadTask(with: request, from: data)
    dataTask.resume()
}

// URLSessionTaskDelegate Handling

func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {
    let uploadProgress: Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
    print("session \(session) uploaded \(uploadProgress * 100)%.")
    progressView.progress = uploadProgress
}

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    print(error.debugDescription)
}


多个图片上传,你是什么意思,你是下载还是上传图片到服务器我是用API上传图片到服务器。你是用AFNetworking上传图片吗?不,我不是用AFNetworking上传图片。这里我的问题不是获取图像上载状态,我的问题是如何在不重新加载UITableViewCell的情况下显示进度指示器。多个图像上载,你的意思是什么,你正在下载或上载图像到服务器我正在使用API将图像上载到服务器。你正在使用AFNetworking上载图像吗?否,我没有使用AFNetworking上传图像。这里我的问题不是获取图像上传状态,我的问题是如何在不重新加载UITableViewCell的情况下显示进度指示器。这个解决方案不会像我在问题中已经说过的那样工作,如果我使用重新加载Rowatindexpath方法更新单元格信息,那么单元格将持续闪烁。我想我不理解您的意思。在我的回答中,我没有在哪里重新加载行。您所说的是正确的,如果您一次又一次地重新加载该行,它将闪烁,但在这里,就像我在不重新加载的情况下更新标签文本一样,您可以使用UIProgressBiew的setProgressbar函数来更新进度。您不需要重新加载。如果你需要澄清,请告诉我。打字错误:这是UIProgressViewYes@kerry的setProgress函数,你不明白。我想说我想显示更新进度,比如whatsapp上传和下载进度,所以我认为UIProgressView不适合我的要求。在我的问题中最重要的一点是,每次从NSURLSession委托方法获得更新时,我都会问如何更新UITableView单元格控件的值。关于您的第一条评论,我同意UIProgressView不适用于您。也许这会奏效。其次,我想说的是,你不必更新整个单元格,你所要做的就是找到那个单元格,然后找到那个自定义单元格的循环控件,并调用该控件的更新方法,而不是更新UITableViewCell。通过这种方式,你可以更新,并且单元格不会闪烁。这种解决方案不会像我在问题中已经说过的那样工作,如果我使用ReloadRowatineXpath方法更新单元格信息,那么单元格会持续闪烁。我想我不明白你的意思。在我的回答中,我没有在哪里重新加载行。您所说的是正确的,如果您一次又一次地重新加载该行,它将闪烁,但在这里,就像我在不重新加载的情况下更新标签文本一样,您可以使用UIProgressBiew的setProgressbar函数来更新进度。您不需要重新加载。如果你需要澄清,请告诉我。打字错误:这是UIProgressViewYes@kerry的setProgress函数,你不明白。我想说我想显示更新进度,比如whatsapp上传和下载进度,所以我认为UIProgressView不适合我的要求。在我的问题中最重要的一点是,每次从NSURLSession委托方法获得更新时,我都会问如何更新UITableView单元格控件的值。关于您的第一条评论,我同意UIProgressView不适用于您。也许这会奏效。其次,我想说的是,你不必更新整个单元格,你所要做的就是找到那个单元格,然后找到那个自定义单元格的循环控件,并调用该控件的更新方法,而不是更新UITableViewCell。这样您就可以更新和更新单元格wo
不要闪烁。Hello@Dhaval Dobariya你能帮我解决这个问题吗?Hello@Dhaval Dobariya你能帮我解决这个问题吗?请仔细阅读这个问题,你的UITableView和UITableiViewCell在哪里,因为对于一个图像来说并不复杂。但是谢谢你的回复!!!请仔细阅读问题,您的UITableView和UITableiViewCell在哪里,因为对于一个图像来说并不复杂。但是谢谢你的回复!!!