Как превратить единственный контейнер в dropDestination для нескольких Transferable типов ?

Новый протокол Transferable был представлен на WWDC 2022 и призван значительно сократить усилия, необходимые с нашей стороны для копирования и вставки (Copy & Paste), a также для перетаскивание и “сброса” (Drag & Drop) данных внутри одного приложения или между разными приложениями.

 Он пришел на замену классу NSItemProvider в iOS 16+, macOS 13+ (Ventura и новее), watchOS 9.0+ и tvOS 16+. Познакомиться с некоторыми аспектами применения протокола  Transferable можно в постах Протокол Transferable меняет правила игры для Drag & Drop в SwiftUI и Протокол Transferable в SwiftUI — передача альтернативного контента с помощью ProxyRepresentation.

Однако попытка использовать протокол  Transferable в демонстрационном примере EmojiArt из  курса CS193P Стэнфордского университета, Весна 2021 (Лекция 9. Drag &Drop) и заменить класс class NSItemProvider на протокол Transferable привела к вопросу о том, как поддерживать “сброс” (Drop) нескольких Transferable ТИПов в один контейнер.

EmojiArt — это приложение, которое позволяет пользователю создавать определенную «картину», зайдя в интернет и выбрав там понравившееся изображение, которое можно «бросить» (Drop) на свой EmojiArtDocument в качестве красивого фонового изображения, а затем добавив к нему эмодзи (смайлики), создать красивое произведение искусства. Нам нравятся эмодзи. Эмодзи можно выбрать из любой тематической палитры, «бросать» их на создаваемую вами «картину» и передвигать их повсюду, изменять их размер. В нижней части экрана у нас целый спектр палитр эмодзи на разные темы.

В таком приложении мы должны предоставить пользователю возможность перетаскивать и «бросать» (Drag & Drop) строку String, URL-адрес или данные Data (например, данные изображения) в один и тот же ZStack. И до появления протокола  Transferable это было сделано с помощью класса class NSItemProvider и View модификатора .onDrop:.  .  .  .  .  .  .  .  .  .  .  .  .  .

Проблема в том, что при использовании нового протокола Transferable и нового View модификатора .dropDestination (for: action: isTargeted:); его параметр for не принимает несколько ТИПов «сбрасываемых» объектов одновременно, как это делает выше приведенный View модификатор .onDrop (of: [.plainText, .url, .image] …).

Читать далее

Протокол Transferable в SwiftUI — передача альтернативного контента с помощью ProxyRepresentation

В предыдущем посте у нас был первый практический опыт работы с протоколом Transferable; новым API, который был представлен на WWDC 2022 и который призван значительно сократить усилия, необходимые с нашей стороны для копирования и вставки (Copy & Paste), a также для перетаскивание и “сброса” (Drag & Drop) данных внутри одного приложения или между разными приложениями.

Если говорить более подробно, то в первом посте продемонстрировано, как перетаскивать и “сбрасывать” (Drag & Drop) объекты пользовательских ТИПов, которые реализуют протокол Codable, при этом было рассмотрено несколько интересных концепций:

  • типы контента (content types UTI) и как декларировать пользовательские UTIs,
  • правильная реализация протокола Transferable, чтобы объекты представленного пользовательского типа UTI можно было перетаскивать,
  • как запустить операцию перетаскивания (Drag) в SwiftUI,
  • как управлять “сбросом” (Drop) перетаскиваемого объекта в SwiftUI.

Этот пост в значительной степени является продолжением предыдущего, поскольку он фокусируется на другой функции протокола Transferable: a именно, как указать дополнительный контент content type для передачи поверх основного перетаскиваемого контента content type.

Читать далее

Протокол Transferable меняет правила игры для Drag & Drop в SwiftUI

На WWDC 2022 среди других интересных анонсов Apple представила новый протокол в Swift под названием Transferable. Transferable позволяет очень легко и просто копировать данные между разными точками в одном и том же приложении или в разных приложениях. И когда речь идет о копировании, это включает не только Copy & Paste (копирование и вставку), но и Drag & Drop (перетаскивание и «сброс»).

До появления протокола Transferable передача данных как между отдельными частями одного приложения, так и между разными приложениями, осуществлялась классом class NSItemProvider. Именно этот класс делает очень сложные вещи, связанные с передачей данных между процессами. Он также решает проблемы с безопасностью и определенно там есть многопоточность, потому что мы не хотим блокировать UI двух приложений в случае передачи между ними больших по объему  изображений. Класс NSItemProvider управлял всем этим вместо нас. К сожалению, класс NSItemProvider — это до-Swift класс, и мы должны использовать “as” как  “мостик” между такими Swift ТИПами как String, и такими ТИПами старого NS Мира, как NSString, это Objective-C вещи, и “as” является “мостом” в этот старый мир. До появления протокола Transferable технология Drag & Drop (перетаскивание и сброс) была одним из таких мест соприкосновения «старого» и нового Миров.

Новый протокол Transferable можно использовать только в операционных системах iOS 16+, macOS 13+ (Ventura и новее), watchOS 9.0+ и tvOS 16 +. Фактически, протокол Transferable заменил NSItemProvider, и для тех, кто хочет программировать операции Copy & Paste (копирование и вставку) и Drag & Drop (перетаскивание и «сброс») он меняет правила игры.

У протокола Transferable есть только одно требование: указать хотя бы одно представления передаваемых данных в static свойстве transferRepresentation:Многие Swift ТИПы уже реализуют протокол Transferable:

  • String
  • Data
  • URL
  • Attributed String
  • Image

Для ваших оригинальных Моделей Данных Apple предоставила API различных представлений передаваемых данных TransferRepresentation, но вы также можете определить и свои собственные представления. Определяемые системой представления передаваемых данных TransferRepresentation охватывают большинство случаев использования. Они включают:

  • CodableRepresentation — Передача данных, описанных структурой, которая реализует протокол Codable
  • DataRepresentation — Передача данных, которые могут быть особым образом закодированы в Data и декодированы из Data.
  • FIleRepresentation — Передача данных путем сохранения информации на диске и передача URL. Apple советует использовать этот тип представления для больших объемов данных.
  • ProxyRepresentation — для передачи альтернативного контента того же самого представления.

В результате протоколу Transferable для Copy & Paste (копирования и вставки) или для Drag & Drop (перетаскивание и «сброса») потребуется всего несколько строк кода для выполнения всей тяжелой работы «за кулисами» для:

  • пользовательских ТИПов, реализующих протокол Codable.
  • данных Data
  • файлов Files

В этом посте мы рассмотрим, как перетаскивать (Drag and Drop) с помощью протокола Transferable данные пользовательского ТИПа, которые реализуют протокол Codable. И лучше всего это показано в статье «Опыт использования протокола Transferable для Drag & Drop в SwiftUI» (First Experience With Transferable Implementing Drag And Drop In SwiftUI), перевод который я и сделаю. Читать далее

Ожидается новый стэнфордский курс CS193P Весна 2020, но несколько позже.

Пол Хэгерти 30 марта 2020 года начал читать свой новый курс CS193P Весна 2020. Во всем мире, конечно, интересуются, будет ли он выложен в открытом доступе, что Стэнфорд делал практически всегда на протяжении 10 лет. В ответ на многочисленные просьбы, Пол Хэгерти выложил в своем уже порядком застоявшемся блоге сообщение, которое я здесь привожу в переводе на русский язык.

«Для не стэнфордских студентов. Тем, кто следит за обновлением курса CS193P. 
Что касается обновления курса CS193P Весна 2020 года, то я хочу вам сообщить следующее.

Многие из вас, вероятно, знают, что Стэнфордский университет в этом квартале в рамках всемирных усилий по замедлению распространения нового коронавируса предоставляет для своих студентов все свои курсы в режиме онлайн. Хотя может показаться, что это даёт нам прекрасную возможность сделать курс доступным онлайн для просмотра всеми, кто не является студентами Стэнфорда, надо понимать, что это сделать непросто и причина заключается в том, что ресурсы в Стэнфорде, которые делают курсы доступными в Интернете, ограничены. Понятно, что они полностью исчерпаны в данный момент, когда мы пытаемся сделать так много курсов ( а на самом деле ВСЕ) доступными онлайн для своих студентов.

Поэтому, хотя мы искренне хотим опубликовать CS193P за пределами Стэнфорда в этом квартале, в настоящее время вопрос заключается в том, сможем ли мы (и / или когда) сделать это. Оставайтесь с нами, и если что-то изменится, мы дадим вам знать.

Курс CS193P Стэнфордского университета «Разработка приложений для iOS» осень 2017-18 (на основе iOS 11 и Swift 4) доступна для iPhones и iPads на iTunesU. Или вы можете посмотреть его на своем Mac в приложении Podcast здесь

Надо сказать, что в данный момент, когда Apple на своей последней конференции разработчиков WWDC 2019 предоставил так много всяких новых возможностей и по разработке UI (SwiftUI), и по взаимодействию  с интернетом (Combine), и отдельную операционную систему iPadOS, и инструмент Mac Catalyst, а Swift 5 сильно усложнился за счет дополнительных «фишек» типа «обёртки свойств» @propertyWrapper, «непрозрачного ТИПА» Opaque Types, атрибута @dynamicCallable и т.д., хотелось бы, чтобы Пол Хэгерти всё расставил на свои места, как он это умеет. Обычно он берет все самое передовое. Интересно, будет ли SwiftUI в Лекциях?

Так что будем ждать. Я думаю, что как только в июле ( а может быть раньше) закончится учебный процесс, у нас есть шанс получить CS193P online.

А пока вы можете получить на этом сайте доступ к русскоязычным конспектам упомянутого в обращении профессора Стэнфордский курса«Developing  iOS 11 Apps with Swift», адаптированного к iOS 12 и Swift 4.

Курс CS193p Winter 2017 «Developing iOS 10 Apps with Swift» на подходе.

Стэнфордский курс CS193p Зима 2017 «Developing iOS 10 Apps with Swift» уже появился на iTunes, но пока там только заголовок и описание. По-видимому, идет оформление, и первые лекции появятся в ближайшее время.
1 февраля ссылка на этот курс в iTunes исчезла. Я не знаю, что это означает — идет оформление материала, курс будет выложен позже или не будет выложен вообще (что уже было осенью 2015 года). Ждем развития событий.

Наш форум переезжает на Piazza

Уважаемые пользователи сайта bestkora.com.

Наш форум переезжает на Piazza! Обсуждение стэнфордских курсов CS193P по разработке iOS приложений на Swift (iOS 7, iOS 8, iOS 9 и будущего iOS10) мы будем проводить на  Piazza — том же инструменте, на котором профессор Пол Хэгерти проводит обсуждение со своими студентами. Чем быстрее вы начнете спрашивать на  Piazza вопросы по лекциям, демонстрационным примерам и заданиям стэнфордского курса CS193P, тем быстрее вы почувствуете преимущество накопленных здесь знаний ваших коллег и инструкторов. Вместо того, чтобы посылать email, вы можете послать свой вопрос на  Piazza и ваши коллеги и я постараемся ответить на него. Мы приветствуем любые ваши вопросы по тем направлениям разработки iOS приложений на Swift, над которыми вы работаете — даже если они заданы анонимно.
Я постараюсь постепенно перенести наиболее интересные вопросы с нашего старого форума на  Piazza.

Вы можете зарегистрироваться на новом форуме по ссылке, при этом надо указать private код курса mf141.

Всемирная конференция разработчиков WWDC 2016. Что впечатлило.

Screen Shot 2016-06-14 at 12.14.23 PM

Apple анонсировала множество новых возможностей на своей ежегодной конференции разработчиков WWDC 2016. Я хочу поделиться с Вами некоторыми из них, которые, по-моему,заслуживают внимания….

— Swift Playgrounds с iOS 10, теперь вы можете писать Swift код прямо на вашем iPad. Важно заметить, что новые приложения  playgrounds — это не Xcode. Правда вы можете открыть в этом приложении Swift Playgrounds, разработанные в Xcode, путем «сбрасывания» AirDrop ваших файлов на iPad. Конечно, с помощью этого приложения вы не сможете создать полностью готовое приложение на вашем iPad. Но это, возможно, мотивирует Apple в сторону разработки iOS приложений на iPad. Специально для  Swift Playgrounds в клавиатуру добавили дополнительный ряд символов. Я уверена, что это новое приложение привлечет больше людей в прекрасный мир Swift! Приложение появится осенью и будет бесплатным.

— SiriKit  Это долгожданная новость! Apple анонсировала, что вы можете интегрировать Siri в код вашего приложения. Например, вы могли бы в своем приложении Калькулятор не набирать операнды и операции на клавиатуре, а сказать Siri: «Рассчитай-ка мне функцию sin(M) + M для M = π и построй график.»

— Xcode 8 Здесь множество обновлений, но больше всего впечатляют инструменты отладки. Если ваше приложение «ест» много памяти, то  Xcode теперь предоставляет вам карту для просмотра того, как все объекты в вашем приложении связаны. Демонстрация этого — просто сногсшибательная. Теперь Xcode  8, как и другие IDEs, поддерживает подключение  plugins (extensions).

-Swift 3 Chris Lattner (создатель Swift) сказал, что главная цель этой версии Swift — стабильность. Те, кто использует Swift на протяжении последних двух лет, знает, что он изменился ЗНАЧИТЕЛЬНО. Все эти изменения были сделаны, чтобы изобрести наилучшую версию Swift. Надеюсь, что Swift 3 будет самой стабильной версией Swift и что новые версии не будут рушить существующий код. Кстати, Xcode 8 поставляется с двумя версиями Swift: Swift 2.3 (очень небольшие изменения по сравнению со Swift 2.2) и Swift 3, так что нет принуждения : вы сами можете решить, когда вам переходить на Swift 3.

Демонстрационные примеры и Задания для курсов iOS 9 и iOS 8 будут адаптированы к iOS 10 и Swift 3, когда появится официальная версия.

 

Swift 2.0 и iOS 9 уже на пороге

Меньше, чем через неделю будет объявлено о выходе официальных (или Gold Master) версий Swift 2.0iOS 9 и Xcode 7. Сейчас действует бэта 6 версия этого программного обеспечения,  Поэтому я решила на своем сайте обновить демонстрационные примеры, сопровождающие замечательный стэнфордский курс CS193P WINTER 2015 «Developing iOS 8 Apps with Swift» до  Swift 2 для запуска их в Xcode 7. Самое интересное в этой новости заключается в том, что из Xcode 7 вы можете запустить эти демонстрационные примеры на своем устройстве (или поделится с друзьями) совершенно бесплатно — для этого не нужно иметь сертификат разработчика Developer Account,  стоимостью 99 $/год. Начиная с Xcode 7 политика Apple по отношению к разработчикам изменилась. Они хотят привлекать к разработке приложений более молодых программистов. Но не нужно ждать выхода официальных версий  — уже сейчас Xcode 7  (а вместе с ней Swift 2 и iOS 9) находятся в публичном доступе здесь.

Надо отметить, что в 2015 году на стэнфордских курсах наряду с демонстрационными примерами для первых лекций, где не требуется реальный прибор (iPhone или iPad) и достаточно симулятора, последние лекции сопровождаются очень интересными демонстрациями с привлечением реальных iPhone или iPad:

Читать далее

Рекомендации изучающим курс cs193p iOS 8

Я разместила Stanford CS 193P iOS 7 Лекция 11 —  UITableView и iPad (UISplitViewController, Popover)  на этом сайте. В ней описывается работа c  TableView, с refresh control и т.д. Но самое главное — в ней показан пример создания универсального приложения  для iPhone и iPad. Пользовательский интерфейс строится на двух отдельных storyboards: одна для iPhone с использованием TableViewController и NavigationСontroller, другая — для iPad с использованием TableViewController и UISplitViewController.

В iOS 8 мы больше этого не увидим, у нас будет одна универсальная (а точнее адаптивная) storyboard с универсальным и довольно сложным UISplitViewController. Для того, чтобы понять, как работает этот универсальный  UISplitViewController в iOS 8, нужно знать, откуда он такой взялся, и почему был сделан именно так.  У вас есть возможность подступиться к изучению нового сложного  адаптивного UISplitViewController в iOS 8 через изучение более простого варианта UISplitViewController на iOS 7, который Пол Хэгерти очень подробно и обстоятельно описывает и  демонстрирует на примере просмотра фотографий с Flickr. Кстати, теоретическая часть, описывающая UISplitViewController на iOS 7,  рассказывается на пример Графического Калькулятора, который нам предстоит создать на iOS 8 в Задании 3 или 4.

Методы делегата UISplitViewController считались самыми трудоемкими и обременительными во всем iOS 7,  но они — «цветочки» по сравнению с методами делегата нового UISplitViewController в iOS 8 в контексте адаптивной философии (size classesTraitCollection). У вас появилась возможность заранее подготовиться к их изучению.

Форум для обсуждения лекций и заданий

ВНИМАНИЕ ОБСУЖДЕНИЕ лекций и заданий этих курсов будет проводится на форуме Google Group  Swift[ru].

Там можно задавать вопросы и выкладывать варианты заданий в Github или Dropbox.