Cleanup draft attachment loading and handle missing attachments

#4
This commit is contained in:
Shadowfacts 2019-09-06 18:50:18 -04:00
parent 49380692f3
commit 818c0afec6
Signed by: shadowfacts
GPG Key ID: 94A5AB95422746E5
3 changed files with 39 additions and 12 deletions

View File

@ -580,21 +580,42 @@ extension ComposeViewController: DraftsTableViewControllerDelegate {
updatePlaceholder()
updateCharactersRemaining()
let result = PHAsset.fetchAssets(withLocalIdentifiers: draft.attachments.map { $0.assetIdentifier }, options: nil)
self.selectedAssets = []
var i = 0
while i < result.count {
selectedAssets.append(result[i])
i += 1
var assets = [String: (asset: PHAsset, description: String)]()
var addedAssets = 0
while addedAssets < result.count {
let asset = result[addedAssets]
let attachment = draft.attachments.first(where: { $0.assetIdentifier == asset.localIdentifier })!
assets[asset.localIdentifier] = (asset, attachment.description)
addedAssets += 1
}
self.selectedAssets = assets.values.map { $0.asset }
updateAttachmentViews()
var j = 0
for subview in attachmentsStackView.arrangedSubviews {
guard let mediaView = subview as? ComposeMediaView else { continue }
mediaView.descriptionTextView.text = draft.attachments[j].description
for case let mediaView as ComposeMediaView in attachmentsStackView.arrangedSubviews {
let attachment = draft.attachments.first(where: { $0.assetIdentifier == mediaView.assetIdentifier })!
mediaView.descriptionTextView.text = attachment.description
// call the delegate method manually, since setting the text property doesn't call it
mediaView.textViewDidChange(mediaView.descriptionTextView)
j += 1
}
}
func draftSelectionCompleted() {
// check that all the assets from the draft have been added
if let currentDraft = currentDraft, selectedAssets.count < currentDraft.attachments.count {
// some of the assets in the draft weren't loaded, so notify the user
let difference = currentDraft.attachments.count - selectedAssets.count
// todo: localize me
let suffix = difference == 1 ? "" : "s"
let verb = difference == 1 ? "was" : "were"
let alertController = UIAlertController(title: "Missing Attachments", message: "\(difference) attachment\(suffix) \(verb) removed from the Photos Library and could not be loaded.", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertController, animated: true)
}
}
}

View File

@ -11,6 +11,7 @@ import UIKit
protocol DraftsTableViewControllerDelegate {
func draftSelectionCanceled()
func draftSelected(_ draft: DraftsManager.Draft)
func draftSelectionCompleted()
}
class DraftsTableViewController: UITableViewController {
@ -61,7 +62,9 @@ class DraftsTableViewController: UITableViewController {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate?.draftSelected(draft(for: indexPath))
dismiss(animated: true)
dismiss(animated: true) {
self.delegate?.draftSelectionCompleted()
}
}
override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {

View File

@ -21,6 +21,8 @@ class ComposeMediaView: UIView {
@IBOutlet weak var descriptionTextView: UITextView!
@IBOutlet weak var placeholderLabel: UILabel!
var assetIdentifier: String?
static func create() -> ComposeMediaView {
return UINib(nibName: "ComposeMediaView", bundle: nil).instantiate(withOwner: nil, options: nil).first as! ComposeMediaView
}
@ -35,7 +37,8 @@ class ComposeMediaView: UIView {
}
func update(asset: PHAsset) {
// let size = imageView.frame.size // is this initialized yet?
self.assetIdentifier = asset.localIdentifier
let size = CGSize(width: 80, height: 80)
PHImageManager.default().requestImage(for: asset, targetSize: size, contentMode: .aspectFill, options: nil) { (image, _) in
self.imageView.image = image