##実現したいこと
DKImagePickerControllerライブラリのUIカスタマイズをしたい。
<現状>
maxSelectableCount
を指定し、指定したカウントが超えてしまった際デフォルトで設定されている以下のアラートが表示される。
title:選択可能枚数に到達しました
message:〜枚まで選択することができます
※〜には添付可能枚数の残りの数字が表示されます。
<やりたいこと>
アラートのmessage内容はこのままで、title部分の内容を変更したい。
swift
1import UIKit 2import DKImagePickerController 3 4class PictureViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 5 6 var assets:[DKAsset]? 7 8 9 @IBOutlet weak var collectionView: UICollectionView! 10 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 } 16 @IBAction func tapButton(_ sender: Any) { 17 let pickerController = DKImagePickerController() 18 pickerController.maxSelectableCount = 4 - (assets?.count ?? 0) 19 pickerController.UIDelegate = CustumUIDelegate() 20 pickerController.didSelectAssets = { [unowned self] (assets: [DKAsset]) in 21 22 self.assets = assets 23 self.collectionView.reloadData() 24 25 } 26 present(pickerController, animated: true, completion: nil) 27 } 28 29 30 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 31 return self.assets?.count ?? 0 32 } 33 34 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 35 let asset = self.assets![indexPath.row] 36 var cell: UICollectionViewCell? 37 var imageView: UIImageView? 38 39 if asset.type == .photo { 40 cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CellImage", for: indexPath) 41 imageView = cell?.contentView.viewWithTag(1) as? UIImageView 42 } 43 44 if let imageView = imageView { 45 46 asset.fetchFullScreenImage(completeBlock: { image, info in 47 imageView.image = image 48 49 }) 50 } 51 return cell! 52 } 53 54 55 56}
swift
1import DKImagePickerController 2 3class CustumUIDelegate: DKImagePickerControllerBaseUIDelegate { 4 override func imagePickerControllerDidReachMaxLimit(_ imagePickerController: DKImagePickerController) { 5 let formatter = NumberFormatter() 6 formatter.numberStyle = .decimal 7 formatter.locale = Locale(identifier: Locale.current.identifier) 8 9 let formattedMaxSelectableCount = formatter.string(from: NSNumber(value: imagePickerController.maxSelectableCount)) 10 11 let alert = UIAlertController.init(title: "最大4枚まで添付することができます", message: (formattedMaxSelectableCount)枚まで選択できます", preferredStyle: .alert) 12 let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel, handler: nil) 13 alert.addAction(okAction) 14 imagePickerController.present(alert, animated: true, completion: nil) 15 } 16} 17
上記を実行すると以下のようにアラートが表示されてしまい、message内容がカスタマイズ前と同じものが表示されない。
title:最大4枚まで添付することができます
message:Optional(~)枚まで選択できます"
※〜には添付可能枚数の残りの数字が表示されます。
以下DKImagePickerControllerBaseUIDelegateクラス
のimagePickerControllerDidReachMaxLimitメソッド
部分参考↓
swift
1//DKImagePickerControllerBaseUIDelegateクラスのimagePickerControllerDidReachMaxLimitメソッド部分 2open func imagePickerControllerDidReachMaxLimit(_ imagePickerController: DKImagePickerController) { 3 let formatter = NumberFormatter() 4 formatter.numberStyle = .decimal 5 formatter.locale = Locale(identifier: Locale.current.identifier) 6 7 let formattedMaxSelectableCount = formatter.string(from: NSNumber(value: imagePickerController.maxSelectableCount)) 8 9 let alert = UIAlertController(title: DKImagePickerControllerResource.localizedStringWithKey("picker.select.maxLimitReached.error.title"), message: nil, preferredStyle: .alert) 10 11 alert.message = String(format: DKImagePickerControllerResource.localizedStringWithKey("picker.select.maxLimitReached.error.message"), formattedMaxSelectableCount ?? imagePickerController.maxSelectableCount) 12 13 alert.addAction(UIAlertAction(title: DKImagePickerControllerResource.localizedStringWithKey("picker.alert.ok"), style: .cancel) { _ in }) 14 15 imagePickerController.present(alert, animated: true) 16 }
> アラートのmessage内容はこのままで、title部分の内容を変更したいが、title部分を変更することによってデフォルトで設定されていたmessage内容を取得できなくなってしまったのでどうやったら取得できるかご教示いただきたい。
この部分の意図がよく汲み取れないのですが、具体的に生じた不都合は何なのでしょうか。
「title 部分を変更することによって、デフォルトで設定されていた message 内容を取得できなくなってしまった」とありますが、「message 内容を取得する」に相当するコードが見当たらないので、問題点が明確でないように感じています。
(Optionalとつくことが問題なのかとおもいましたが、おそらくそうではないと思っています)
わかりにくい説明で申し訳ございません????
> この部分の意図がよく汲み取れないのですが、具体的に生じた不都合は何なのでしょうか。
→もともとアラート表示に関してカスタマイズはしておらず、ライブラリに入っているアラートが表示されていました。しかし今回アラートのtitleだけをカスタマイズし、message内容はデフォルト設定されているものと同じものを表示させたいです。
「しかし今回アラートのtitleだけをカスタマイズし」ということであれば、
> let alert = UIAlertController.init(title: "最大4枚まで添付することができます", message: \(formattedMaxSelectableCount)枚まで選択できます", preferredStyle: .alert)
ここの title 以降の文字列(「最大4枚まで添付することができます」の部分)を変更する、ということとはまた違ったことを実現されたいのでしょうか
ライブラリに入っているアラート(アラートに関して何もカスタマイズしていない状態)のとき、
title:選択可能枚数に到達しました
message:〜枚まで選択することができます
※〜には添付可能枚数の残りの数字が表示されます。
が表示され、今回以下にカスタマイズしたいという意味でした。????
title:最大4枚まで添付することができます
message:〜枚まで選択することができます
※〜には添付可能枚数の残りの数字が表示されます。
maxSelectableCount というプロパティで最大取得枚数を設定できるので、それを使って計算すれば良いのではないでしょうか。
ところで、掲載されているコードを改めて拝見していて気づいたのですが、DKImagePickerController を継承してカスタムクラスを作ろうとされているんですね(Qiitaか何かの記事を参考にされているのでしょうか)。
そうなると、検証するのはちょっと今すぐできないので、まずは上記のプロパティを参照して確かめて見られてはいかがでしょうか。
\(formattedMaxSelectableCount)を\(imagePickerController.maxSelectableCount)にしたらできました????お騒がせしました????
解決できたようでよかったです。
このままだとご質問が未解決で残ってしまうため、自己解決していただけませんでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー