🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

525閲覧

Swift5: ドラッグ&ドロップにおいて任意のクラスのインスタンスを処理したい

tmsah

総合スコア101

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2019/11/23 15:18

Swift5初心者です.ストーリーボードは使っておりません.
UIDragInteractionUIDropInteractionを用いてドラッグ&ドロップの実装を試みています.
ドロップエリアにオブジェクトをドロップした時,(UIImageNSStringクラス等でなくとも)そのオブジェクト自体をそのままドロップエリアに渡して処理を行いたいと考えています.

NSItemProviderを用いればドロップエリアでドロップ後の処理を行えることが分かったのですが,
NSItemProviderに準拠したインスタンス(UIImageNSStringクラスのオブジェクト等)しか渡せないので,下に示すようにクラスを拡張(継承)してCharacterPanelクラスのインスタンスも渡せるようにしたいです..

swift=

1class CharacterPanel: UIView, UIDragInteractionDelegate, NSItemProviderReading, NSItemProviderWriting { 2 static var writableTypeIdentifiersForItemProvider: [String] = [] 3 4 func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Void) -> Progress? { 5 return nil 6 } 7 8 static var readableTypeIdentifiersForItemProvider: [String] = [] 9 10 static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self { 11 return self 12 } 13 14 15. 16. 17. 18 19 20} 21

このように記述した場合,return selfの箇所でエラー(Cannot convert return expression of type 'Self.Type' to return type 'Self')が出てきます.
また,ドロップされる方の実装(dropInteractionのみ)は下のようになっています.

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) { for item in session.items { if item.itemProvider.canLoadObject(ofClass: CharacterPanel.self as! NSItemProviderReading.Type) { item.itemProvider.loadObject(ofClass: CharacterPanel.self as! NSItemProviderReading.Type) { (object, error) in . . . } } }

自分の理解が追いついていない部分も多々ありますが,どのように実装すれば実現可能でしょうか.
この方法以外でも,機能実現の別のアイディア等があれば教えていただきたいです.
よろしくお願いいたします.

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

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

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

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

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

guest

回答1

0

ベストアンサー

staticのつくメソッドはType Methodと呼ばれるもので通常のインスタンスメソッドとは違います。
Type Methodでは self はクラス自身を表しておりそのインスタンスではありません。
ですのでそのメソッドでは引数(dataとtypeIdentifier)を頼りにあなたが新たにインスタンスを生成して返す必要があります。

投稿2019/11/27 08:36

MasakiHori

総合スコア3391

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問