Ну, я обнаружил, что решение было двояким ...
Прямой ответ на вопрос (но не идеальное поведение):
В каждом из switch
случаев (и if
в случае default
) мне нужно было проверить, что activityType
соответствует placeholderItem
. Если это не подходящее совпадение, верните (пустой) placeholderItem как есть (за исключением того, что в случае «Сохранить в файлы» даже пустой заполнитель средства отображения страницы печати приводил к записи файла! Так что вместо возврата заполнителя) верните пустой массив).
Это сработало, и в результате один файл был записан в папку по выбору пользователя, что отвечает на исходный вопрос. Пользователь даже получает возможность указать имя для файла. Но имя по умолчанию совсем не годится - только тип данных (например, «текст» или «данные», в зависимости от того, что было сохранено в файл).
Решение, обеспечивающее большую гибкость : Создайте пользовательский UIActivity
, который будет записывать файл в местоположение, выбранное пользователем, с помощью UIDocumentPickerViewController
. Например, у действия может быть заголовок, такой как «Экспорт в»).
Это оказалось намного более гибким, и я позволю себе использовать имя файла по умолчанию (и расширение!), Которое имело гораздо больший смысл на основе передаваемых данных. У меня также есть возможность добавить дополнительные улучшения в поведение позже (например, я мог бы использовать предупреждение, чтобы пользователь мог выбрать между несколькими различными форматами файлов (для использования для различных целей).
Это не заменяет действие «Сохранить в файлы», поэтому я в итоге выбрал оба из них, и мне все еще нужно было исправить поведение действия «Сохранить в файлы», как описано выше.
Это оставляет мне действие «Экспорт» и «Сохранить», которые работают аналогично, но одно более гибкое и интуитивно понятное, чем другое, и я могу заставить их использовать разные форматы файлов по умолчанию.
Мой новый код (для default
части внешнего switch
) ниже ...
default:
if activityType?.rawValue == "com.stuff.thing.activity.export" {
if placeholderItem is [Rat] {
return rats
} else {
return placeholderItem!
}
} else if activityType?.rawValue == "com.apple.CloudDocsUI.AddToiCloudDrive" {
if placeholderItem is Data {
return attrString
} else {
// Don't return the placeholder item here! Some (eg print page renderer) can result in a file being written!
return [] as [Any]
}
}
return attrString
}