2017-12-05 5 views
3

私はiOS11のドロップ機能を使いこなしています。私は標準UIImageなどの多くの例を見つけましたが、カスタムファイルは何も見つかりませんでした。iOS11カスタムビューでドロップされたカスタムファイルを処理する方法

ドロップ部分はうまく機能し、私はそれを使ってカスタムファイルをドロップし、それを私のアプリケーションにインポートします。

問題は、このファイルのデータしか取得できないため、その名前と拡張子を取得したいと考えています。

私のカスタムファイル処理方法がこの情報を取得する方法であるかどうかはわかりません。もしそうなら、ファイルからこの情報をどのように取得しますか?

私は、クラスをNSItemProviderReadingプロトコルに準拠しています。

class DropFile : NSObject, NSItemProviderReading { 
    let fileData:Data? 

    required init(data:Data, typeIdentifier:String) { 
     fileData = data 
    } 

    static var readableTypeIdentifiersForItemProvider: [String] { 
     var documentTypeArray: [String] = [] 

     for ext in FileImportProcessHelper.sharedInstance.getImportDocumentType() { 
      let UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, ext as CFString, nil) 
      documentTypeArray.append((UTI?.takeRetainedValue() as String?)!) 
     } 
     return documentTypeArray 

    } 

    static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self { 
     return self.init(data: data, typeIdentifier: typeIdentifier) 
    } 
} 

これは私のViewControllerUIDropInteractionDelegate

// MARK: Handling Drop 

@available(iOS 11.0, *) 
// We refuse the dropped items based on their UTI 
func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool { 

    var documentTypeArray: [String] = [] 

    for ext in FileImportProcessHelper.sharedInstance.getImportDocumentType() { 
     let UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, ext as CFString, nil) 
     documentTypeArray.append(UTI?.takeRetainedValue() as! String) 
    } 
    return session.hasItemsConforming(toTypeIdentifiers: documentTypeArray) && session.items.count == 1 
} 

@available(iOS 11.0, *) 
func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal { 
    // Copy file from source app 
    return UIDropProposal(operation: .copy) 
} 

@available(iOS 11.0, *) 
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) { 
    // Consume drag items 
    session.loadObjects(ofClass: DropFile.self) { items in 
     if let fileItems = items as? [DropFile] { 
      DragnDropManager.sharedManager.createDropObject(fileItems: fileItems) 
     } 
    } 
} 

に準拠したそしてどのように私は私のファイルを書き込みます。

func createDropObject(fileItems: [DropFile]) { 
     let documentsPathString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first 
     let inbox = URL(fileURLWithPath: documentsPathString!).appendingPathComponent("UserDropInbox/") 

     do { 
      try FileManager.default.createDirectory(atPath: inbox.path, withIntermediateDirectories: true, attributes: nil) 
     } catch let error as NSError { 
      NSLog("Unable to create directory \(error.debugDescription)") 
     } 

     for file in fileItems { 
      do { 
       let dropFilePath = inbox.appendingPathComponent("File").appendingPathExtension("pdf") 
       try file.fileData?.write(to:dropFilePath) 
      } catch { 
       NSLog(error as! String) 
      } 
     } 

     FileImportInboxManager.shared.hasReceivedFiles = true; 
} 

答えて

1

私は認める、それは簡単ではありません。

  • あなたはUIDropSessionitemsメンバーでユーザーがドラッグすべてUIDragItem
  • これらの各項目がNSItemProvideritemProviderメンバー
  • を持って一覧表示することができます
  • この商品の提供者は、String?suggestedNameのメンバーがあります。nil

単純なループは、すべてのセッションの項目は名前を示唆印刷する:

for item in session.items { 
    if let name = item.itemProvider.suggestedName { 
     print(name) 
    } 
} 

ファイルは、ファイルアプリから来るとき実際に、それはその拡張子を除いたファイルの名前を提供しますが、しかし、あなたは簡単にすることができます与えられましたそのUTIにアクセスすると、オリジナルのものに近い拡張子を追加することができます(例えばjpgではなくjpeg)。

関連する問題