Приложение на SwiftUI, которое показывает популярные фреймворки Apple в виде сетки. По тапу открывается детальный экран с описанием и кнопкой «Learn More», которая запускает встроенный Safari с документацией Apple.
- Показывает список фреймворков в виде «плиток» (LazyVGrid)
- Открывает детальный экран (sheet) по тапу на плитку
- Кнопка «Learn More» открывает документацию во встроенном Safari (SFSafariViewController)
- Использует архитектуру MVVM (Model-View-ViewModel)
- Model - данные и их структура (например,
Framework+MockData) - View - экраны и компоненты интерфейса (SwiftUI-разметка)
- ViewModel - «связующее звено»: хранит состояние экрана и реагирует на действия пользователя
Как это работает:
- Пользователь тачит по карточке фреймворка в сетке (View)
- View говорит ViewModel: «выбран такой-то фреймворк»
- ViewModel обновляет опубликованные свойства (
@Published) - SwiftUI видит изменение и показывает детальный экран (sheet)
Apple-Frameworks/
├─ Apple_FrameworksApp.swift # Точка входа приложения
├─ Assets.xcassets/ # Иконки фреймворков и ресурсы
├─ Model/
│ └─ Framework.swift # Модель данных + MockData
├─ Screens/
│ ├─ FrameworkGridView/
│ │ ├─ FrameworkGridView.swift # Экран с сеткой фреймворков
│ │ └─ FrameworkGridViewModel.swift # ViewModel для сетки
│ └─ FrameworkDetailView/
│ └─ FrameworkDetailView.swift # Детальный экран (sheet)
├─ UIKit Components/
│ └─ SafariView.swift # Обёртка вокруг SFSafariViewController
├─ Views/
│ ├─ Buttons/
│ │ ├─ AFButton.swift # Красная кнопка действия
│ │ └─ XDismissButton.swift # Кнопка закрытия sheet
│ └─ Components/
│ ├─ FrameworkTitleView.swift # Плитка: иконка + название
│ └─ DescriptionView.swift # Текст описания фреймворка
└─ README.md
- Пользователь тапает по
FrameworkTitleViewвFrameworkGridView - В обработчике жеста View устанавливает в ViewModel
selectedFramework - В
didSet(или через логику во ViewModel) включается флагisShowingDetailView = true - Вью читает это published-состояние и показывает
.sheet(...) - На детальном экране по кнопке «Learn More» меняется локальное состояние
isShowingSafariView = true, что открываетSafariView
Это «реактивная» модель: изменилось состояние - SwiftUI сам перерисует нужные части интерфейса.
Требования:
- Xcode 15+
- iOS 16+
Шаги:
- Клонируйте репозиторий
- Откройте
Apple-Frameworks.xcodeproj - Выберите симулятор и запустите (⌘R)
- Swift 5.9+
- SwiftUI (NavigationStack, LazyVGrid, Sheet)
- Combine-подход через
@StateObject,@Published,@Binding - SFSafariViewController (через UIViewControllerRepresentable)
- Адаптивное число колонок (iPhone/iPad)
- Поиск и фильтрация по фреймворкам
- Закладки «Избранное» + сохранение в хранилище
- Локализация (EN/RU)
- Загрузка данных из JSON/сети вместо MockData
Проект создан на основе обучающего туториала от Sean Allen. Материал был адаптирован и дополнен под мои цели обучения.