This is a YouTube like app sample with the Model-View-Presenter pattern. It uses DiffableDataSource to display search view and detail view.
Let's create you project on Google Cloud Platform and add an API Key to access YouTube Data API v3. https://console.cloud.google.com/apis/credentials
If you could create an API key, add it to Info.plist as YouTubeApiKey.

Detail.Item relates to Views.
| Detail.Item | View |
|---|---|
| .summary | DetailSummaryView |
| .channel | DetailChannelView |
| .description | DetailDescriptionView |
| .video | VideoView |
| .loading | LoadingView |
Detail.Item is appended to NSDiffableDataSourceSnapshot with any Detail.Section and reflects snapshot to UITableView.
enum Detail {
enum Section: Hashable {
case information
case videos(segments: [VideoSegment])
case loading
}
enum Item: Hashable {
case summary(SummaryViewData)
case channel(ChannelViewData)
case description(String)
case video(VideoViewData)
case loading
}
...
}| View | Snapshot |
|---|---|
![]() |
stackView.axis = .vertical![]() |
When you tap a triangle button on DetailSummaryView, Item.descriptin is inserted to bottom of Section.information. If that state is refrected to UITableView, it displays DetailDescriptionView with fade animation.
| View | Snapshot |
|---|---|
![]() |
stackView.axis = .vertical![]() |
When you rotate your device, stackview.axis is changed to .horizontal. The layout will change that left side is player, right side is UITableView.
| View | Snapshot |
|---|---|
![]() |
stackView.axis = .horizontal![]() |
- Xcode 12.4
- iOS 14.1
- Nuke
YouTubeSampleWithMVP-DiffableDataSource is available under the MIT license. See the LICENSE file for more info.





