SplitViewで、複数のアプリを同時に表示するメリットの一つが、他アプリのデータをDrag and Dropでコピーできること。
UITextField, UITextAreaは、デフォルトでテキストのDnDに対応している様子。
今回対応中のレシピアプリでは、画像が登録できる機能があるので、他アプリから画像をDropで追加できるようにしてみた。
Drag and Dropの仕組みは、iOS 11以上のUITableView, UICollectionView で実装が可能。
Dropの実装
使用するのは、UITableViewDropDelegatecanHandleのメソッドで、受け取り可能なClassかをチェックする。今回はUIImageのみ可能に。
Dropの処理は、以下のように実装した。
UITableViewDropPlaceholder で一時的なViewを作り、処理が完了したら削除する。
Dragの実装
Dragを実装すると、外部アプリへデータをドラッグできるようになる。使用するのはUITableViewDragDelegate。itemsForBeginning で、受け渡したい情報を設定する。
DragDelegateとともに、tableView(_:canMoveRowAt:)、tableView(_:moveRowAt:to:) などを実装すると、テーブル内のセルの順番をDnDで操作することも可能になる。
以下は、同じSection内に限りDnDで行を入れ替えることができる実装例。
外部アプリにデータを渡さないのであれば、itemsForBeginningの戻り値は設定なしでOK。
ただし、tableView(_:moveRowAt:to:) の処理中で、tableView.reloadSections で更新すると、次回から行移動ができなくなるバグ?があるみたいなので注意。tableView.reloadData() だと大丈夫のようだ。
iPadだと、登録がかなり楽になる! 素敵!
次回につづく。