Connect with us

Разработка

Перетаскивание и буфер обмена с помощью Transferable

Используя Transferable, вы не только упрощаете реализацию, но и делаете своё приложение совместимым с современными формами взаимодействия, от буфера обмена до перетаскивания, используя единую модель данных.

Опубликовано

/

     
     

Для приложений, требующих множественных взаимодействий, таких как перетаскивание файлов или копирование и вставка данных, используйте протокол Transferable, чтобы обеспечить совместное использование сущностей вашей модели между приложениями или между областями одного приложения.

Для использования копирования и вставки и перетаскивания вам потребуется стандартный шаблон структуры. Эта структура будет совместима с действиями, которые мы хотим воспроизвести в приложении.

В следующем примере определяется тип NoteItem, соответствующий протоколу Transferable, предоставляя представление для передачи данных, которое можно использовать при трансфере.

import SwiftUI
import UniformTypeIdentifiers

struct NoteItem: Codable, Transferable, Identifiable {
    var id: UUID = UUID()
    var text: String

    static var transferRepresentation: some TransferRepresentation {
        DataRepresentation(contentType: .plainText) { note in
            note.text.data(using: .utf8) ?? Data()
        } importing: { data in
            let content = String(decoding: data, as: UTF8.self)
            return NoteItem(text: content)
        }
        
        ProxyRepresentation { note in
            return note.text
        }
    }
}

Копирование и вставка

Для копирования и вставки используйте UIPasteboard. Это объект, позволяющий пользователю переносить данные из одного места в другое с помощью буфера обмена системы.

func copyToClipboard(note: NoteItem) {
    UIPasteboard.general.string = note.text
}

func pasteNote() -> NoteItem? {
    if let text = UIPasteboard.general.string {
        return NoteItem(text: text)
    }
    
    return nil
}

Используя SwiftUI, можно подключить к интерфейсу следующие функции:

  • Кнопка «Копировать» для отправки содержимого в буфер обмена
  • Кнопка «Вставить» для чтения содержимого из буфера обмена и обновления состояния представления
struct ExampleView: View {

    @State private var notes = [
        NoteItem(text: "First note 📝"),
        NoteItem(text: "Second note ✈️")
    ]
    
    var body: some View {
        Button("Copy") {
            copyToClipboard(note: notes[index])
        }
        
        Button("Paste") {
            if let item = pasteNote() {
                droppedNotes.append(item)
            }
        }
    }
}

Перетаскивание

Благодаря соответствию требованиям Transferable ваши модели объектов также будут работать с API перетаскивания SwiftUI:

Text(sourceNote.text)
    .draggable(sourceNote)

Элемент уже автоматически упакован как .plainText, поскольку мы определили это в TransferRepresentation. SwiftUI интерпретирует перетаскивание, преобразует данные и возвращает готовый к использованию шаблон:

Text(droppedText)
    .dropDestination(for: NoteItem.self) { items, _ in
        if let first = items.first {
            droppedText = "Received: \(first.text)"
        }
        return true
    }

Используя Transferable, вы не только упрощаете реализацию, но и делаете своё приложение совместимым с современными формами взаимодействия, от буфера обмена до перетаскивания, используя единую модель данных.

В этой статье подробно показано, как реализовать перетаскивание с помощью API SwiftUI. Ознакомьтесь!

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: