質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

508閲覧

DKImagePickerController画面遷移

coco7777

総合スコア8

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/09/19 02:31

DKImagePickerControllerでライブラリから取得した複数の画像をphots(配列)に入れて
tableViewのあるcontrollerの配列に渡しcellを生成したいです。
さらにcellをタップし画面遷移する時に、DKImagePickerController→tableViewのあるcontrollerと渡した複数の画像を
さらに渡してColection Viewに表示したいと考えています。
しかし、cellを生成する時にindex.rowを使うと複数枚の画像を渡すことができないと思います。
複数渡したいものがある場合配列は向かないのでしょうか?
画像選択の最大数が5枚なので5つの配列を用意して1枚ずつ別の配列に入れて渡すことも考えました。

分かりにくい説明になり申し訳ありませんが、知識のあるかた解決方法を回答お願いします。

swift

1 2import UIKit 3import DKImagePickerController 4 5class hennsyuViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UITextFieldDelegate, UITextViewDelegate { 6 7 var completButtonItem:UIBarButtonItem! 8 9 @IBOutlet weak var textField: UITextView! 10 @IBOutlet weak var dateField: UITextField! 11 @IBOutlet weak var hyoukaField: UITextField! 12 @IBOutlet weak var addressField: UITextField! 13 @IBOutlet weak var nameField: UITextField! 14 15 var callback1: ((String) -> Void)! 16 var callback2: ((String) -> Void)! 17 var callback3: ((String) -> Void)! 18 var callback4: ((String) -> Void)! 19 var callback5: ((String) -> Void)! 20 var callback6: ((String) -> Void)! 21 22 var photos: [UIImage] = [] 23 24 var nikkiImage = UIImage() 25 // 実際に選択された枚数 26 var selectedCount = 0 27 28 let pickerController = DKImagePickerController() 29 30 override func viewDidLoad() { 31 super.viewDidLoad() 32 33 dateField.delegate = self 34 hyoukaField.delegate = self 35 addressField.delegate = self 36 nameField.delegate = self 37 textField.delegate = self 38 39 completButtonItem = UIBarButtonItem(title: "完了", style: .done, target: self, action: #selector(completButtonTapped(_:))) 40 self.navigationItem.rightBarButtonItem = completButtonItem 41 42 } 43 44 45 @IBAction func addImageButton(_ sender: Any) { 46 47 pickerController.maxSelectableCount = 5 48 //カメラモード、写真モードの選択 49 pickerController.sourceType = .photo 50 //キャンセルボタンの有効化 51 pickerController.showsCancelButton = true 52 53 pickerController.UIDelegate = CustomUIDelegate() 54 55 56// pickerController.didSelectAssets = { (assets: [DKAsset]) in 57// } 58// } 59 pickerController.didSelectAssets = { (assets: [DKAsset]) in 60 for asset in assets { 61 asset.fetchFullScreenImage(completeBlock: { (image, info) in 62 self.photos.append(image!) 63 }) 64 } 65 } 66 67 pickerController.modalPresentationStyle = .fullScreen 68 69 70 71 present(pickerController, animated: true, completion: nil) 72 73 74 } 75 76 @objc func kbDoneTaped (_ sender:UIButton){ 77 78 self.view.endEditing(true) 79 80 } 81 82 //完了ボタンを押した時 83 @objc func completButtonTapped(_ sender: UIBarButtonItem){ 84 85 let name = nameField.text 86 let date = dateField.text 87 let hyouka = hyoukaField.text 88 let text = textField.text 89 let address = addressField.text 90 91 92 if let n = navigationController, 93 n.viewControllers[n.viewControllers.count - 2] is nikkiTableViewController { 94 95 // ①から遷移してきた場合は完了をタップしたことを表すフラグを設定します。 96 AppState.isEdited = true 97 98 callback1(name!) 99 callback2(date!) 100 callback3(hyouka!) 101 callback4(text!) 102 callback5(address!) 103 104 print("Nikki呼ばれた") 105 106 } 107 navigationController?.popViewController(animated: true) 108 109 } 110 111} 112 113

swift

1import UIKit 2 3class nikkiTableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate{ 4 5 private let cellId = "cellId" 6 7 var addBarButtonItem:UIBarButtonItem! 8 9 var topImageArray = [UIImage]() 10 var nameArray = [String?]() 11 var dateArray = [String?]() 12 var hyoukaArray = [String?]() 13 var textViewArray = [String?]() 14 var addressArray = [String?]() 15 16 var practice: String? 17 18 @IBOutlet weak var nikkiTableView: UITableView! 19 20 21 override func viewDidLoad() {super.viewDidLoad() 22 23 setupSearchBar() 24 25 addBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addBarButtonTapped(_:))) 26 addBarButtonItem.tintColor = UIColor.white 27 28 //navigationVarの右側に追加 29 self.navigationItem.rightBarButtonItem = addBarButtonItem 30 31 nikkiTableView.delegate = self 32 nikkiTableView.dataSource = self 33 34 let appearance = UINavigationBarAppearance() 35 appearance.configureWithOpaqueBackground() 36 appearance.backgroundColor = .rgb(red: 173, green: 216, blue: 230) 37 38 //標準の高さ 39 navigationItem.standardAppearance = appearance 40 //ナビゲーションバーが透過する 41 navigationItem.scrollEdgeAppearance = appearance 42 //標準の文字の大きさ 43 navigationItem.compactAppearance = appearance 44 45 let tapGesture = UITapGestureRecognizer( 46 target: self, 47 action: #selector(dismissKeyboard)) 48 view.addGestureRecognizer(tapGesture) 49 50 tapGesture.cancelsTouchesInView = false 51 52 } 53 54 55 @objc func dismissKeyboard() { 56 navigationItem.titleView?.endEditing(true) 57 } 58 59 60 61 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 62 63 return 190 64 } 65 66 func numberOfSections(in tableView: UITableView) -> Int { 67 68 return 1 69 } 70 71 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 72 73 return nameArray.count 74 75 } 76 77 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 78 79 let cell = nikkiTableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! nikkiTableViewCell 80 81 if let c = cell as? nikkiTableViewCell { 82 83 c.nameLabel.text = nameArray[indexPath.row] 84 c.dateLabel?.text = dateArray[indexPath.row] 85 c.hyoukaLabel?.text = hyoukaArray[indexPath.row] 86 } 87 88 return cell 89 90 } 91 92 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 93 94 let storyboard = UIStoryboard(name: "nikkiTableView", bundle: nil) 95 let textVC = storyboard.instantiateViewController(withIdentifier: 96 "textViewController") as! textViewController 97 98 textVC.name = nameArray[indexPath.row] 99 textVC.address = addressArray[indexPath.row] 100 textVC.hyouka = hyoukaArray[indexPath.row] 101 textVC.date = dateArray[indexPath.row] 102 textVC.text = textViewArray[indexPath.row] 103 104 navigationController?.pushViewController(textVC, animated: true) 105 //タップした後、セルの色が白色に戻る 106 tableView.deselectRow(at: indexPath, animated: true) 107 108 navigationItem.titleView?.endEditing(true) 109 110 111 } 112 113 114 @objc func addBarButtonTapped(_ sender: UIBarButtonItem) { 115 116 let hennsyuVc = storyboard?.instantiateViewController(withIdentifier: "hennsyuViewController") as! hennsyuViewController 117 118 hennsyuVc.callback1 = {n in 119 self.nameArray.insert(n, at: 0) 120 } 121 122 hennsyuVc.callback2 = {d in 123 self.dateArray.insert(d, at: 0) 124 } 125 126 hennsyuVc.callback3 = {h in 127 self.hyoukaArray.insert(h, at: 0) 128 } 129 130 hennsyuVc.callback4 = {t in 131 self.textViewArray.insert(t, at: 0) 132 } 133 134 hennsyuVc.callback5 = {a in 135 self.addressArray.insert(a, at: 0) 136 } 137 navigationController?.pushViewController(hennsyuVc, animated: true) 138 139 } 140 override func viewWillAppear(_ animated: Bool) { 141 142 nikkiTableView.reloadData() 143 144 // TODO: ①に戻ってきたらUITableViewを再描画します。 145 if AppState.isEdited { 146 // ③から完了をタップして戻ってきた場合は②に遷移します。 147 AppState.isEdited = false 148 } 149 150 } 151 152} 153 154 155 class nikkiTableViewCell: UITableViewCell { 156 157 @IBOutlet weak var topImageView: UIImageView! 158 @IBOutlet weak var nameLabel: UILabel! 159 @IBOutlet weak var dateLabel: UILabel! 160 @IBOutlet weak var hyoukaLabel: UILabel! 161 162 override func awakeFromNib() { 163 super.awakeFromNib() 164 165} 166 override func setSelected(_ selected: Bool, animated: Bool) { 167 super.setSelected(selected, animated: animated) 168 169 } 170 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

しかし、cellを生成する時にindex.rowを使うと複数枚の画像を渡すことができないと思います。
複数渡したいものがある場合配列は向かないのでしょうか?

問題を正しく理解できていないかもしれませんが・・
配列でも大丈夫だと思いました。

DKImagePickerControllerではUIImageの配列で1行分の画像を保持していると思いますので、
それが複数行ということで、配列の配列の形(二次元配列)でnikkiTableViewControllerに保持する感じになるかなと思いました。

var photosArray = [[UIImage]]()


nikkiTableViewCellでは1行分のUIImageの配列で保持する感じです。
*hennsyuViewControllerと同様

var photos: [UIImage] = []


nikkiTableViewControllerの
tableView(_:cellForRowAt:)メソッドの中では、
photosArrayのindexPath.rowのデータ(1行分のUIImageの配列)を
nikkiTableViewCellに渡す感じです。

c.photos = photosArray[indexPath.row]


前回の回答が不十分だった点に気づきました。
コールバックのところです。
コールバックの定義自体は1つにして、引数を複数にした方が扱いやすいと思います。
*前回の回答で引数1つだけのサンプルコードを記載してしまいましたので、誤解させてしまったかもしれません。ごめんなさい・・

swift

1class hennsyuViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate, UITextViewDelegate { 2 // ***** 引数が複数のコールバックの定義 3 var callback1: ((String, String, String, String, String) -> Void)! 4 // ...省略... 5 @objc func completButtonTapped(_ sender: UIBarButtonItem) { 6 // ...省略... 7 callback1(name!, date!, hyouka!, text!, address!) 8 // ...省略... 9 } 10}

追記です。

念の為、callbackを設定する側のnikkiTableViewControllerのサンプルコードも記載しておきます。
(0番目に追加しているのは意図的にでしょうか?)

swift

1// nikkiTableViewController 2hennsyuVc.callback1 = { name, date, hyouka, text, address in 3 print(name, date, hyouka, text, address) 4 self.nameArray.insert(name, at: 0) 5 self.dateArray.insert(date, at: 0) 6 self.hyoukaArray.insert(hyouka, at: 0) 7 self.textViewArray.insert(text, at: 0) 8 self.addressArray.insert(address, at: 0) 9}

投稿2022/09/19 05:45

編集2022/09/19 07:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco7777

2022/09/19 06:41 編集

xg63ex2bさん またまた回答ありがとうございます >DKImagePickerControllerではUIImageの配列で1行分の画像を保持していると思いますので、 それが複数行ということで、配列の配列の形(二次元配列)でnikkiTableViewControllerに保持する感じになるかなと思いました。 二次元配列について調べてみました。 まさに私が『こんな感じにしたい』と考えてたものでした。わかりにくい説明にもかかわらず理解して下さってありがとうございます >前回の回答が不十分だった点に気づきました。 コールバックのところです。 コールバックの定義自体は1つにして、引数を複数にした方が扱いやすいと思います。 *前回の回答で引数1つだけのサンプルコードを記載してしまいましたので、誤解させてしまったかもしれません。ごめんなさい・・ とんでもないです、、、 xg63ex2bさんにcallbackというものを教えていただいて自分で複数の値を1つの変数で渡す方法を調べていました。しかし、値がうまく渡らなかったり、エラーが出たりで一旦ビルドができて前に進めるようにとコードを書いていました。 後々、可読性を高めるために整えなければと思っておりました。お手数おかけしてすみません 回答ありがとうございます!!
退会済みユーザー

退会済みユーザー

2022/09/19 07:16

コメントありがとうございます。 二次元配列でイメージ通りにできそうとのことで、何よりです。 > 後々、可読性を高めるために整えなければと思っておりました。 そうだったのですね。 ご自身のペースでOKと思います。 参考になればと思いまして、callbackを設定する側の実装イメージも回答欄に追記しておきたいと思います。 また何かありましたらコメントくださいね。
coco7777

2022/09/19 11:06

xg63ex2bさん ありがとうございます ビルドしようとすると以下のエラーが出ます、、 Stored properties cannot be marked potentially unavailable with '@available' ネットで調べてみるとXcodeが14になってからエラーになるという記事が見受けられるのですが英語の記事が多く解決に至っておりません。 改善方法などわかりますでしょうか? 質問ばかりで申し訳ありません。 記事:https://bytemeta.vip/repo/scenee/FloatingPanel/issues/553 
退会済みユーザー

退会済みユーザー

2022/09/19 11:11

ちょっと調べてみたいと思います。 このエラーはどのようなコードの行で発生していますでしょうか? FloatingPanelのパッケージを使っているところでしょうか?
退会済みユーザー

退会済みユーザー

2022/09/19 11:46

あまり使ったことがないのですが、 @availableは対象のプラットフォームやバージョンにおいて その宣言が使用可能かどうかを制御するための記述なのですね。 CocoaPodsで使っているパッケージの中にこのような記述があるのでしょうか? https://stackoverflow.com/questions/72970985/xcode-14-beta-error-stored-properties-cannot-be-marked-potentially-unavailable stackoverflowの回答では、 例えばパッケージの中に「iOS 14.0」のような記述があった場合、 Podfileにも「platform :ios, '14.0'」のように記述して、 `pod update`コマンドを実行して、 その後`pod install`コマンドを実行する という感じで対処しているように見えました。 *CocoaPodsのことはあまり詳しくないのですが、これらの対処がどういう影響を及ぼすかまではわからないところもあります・・バックアップなどをとっておいて復旧可能なようにしておいてから試した方が良いかもしれません・・
coco7777

2022/09/21 01:48

回答ありがとうございます!! 教えていただいたことを参考にやってみようと思います 毎回ありがとうございます  また回答をお願いすると思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問