Wpis z mikrobloga

zaczynam przygodę ze #switfui / #swift

i na dzień dobry mam zagwozdkę,

jaką właściwie wybrać strukturę katalogów?

Apka będzie wyglądać jak ta sekcja z allegro:
https://i.imgur.com/APl9yp5_d.webp?maxwidth=760&fidelity=grand
czyli logo na górze, potem trzy menu, pośrodku content i na dole znów TabView

https://developer.apple.com/forums/thread/710501

vs

https://www.hackingwithswift.com/books/ios-swiftui/introducing-mvvm-into-your-swiftui-project

To w końcu lubimy MVVM czy nie?
  • 24
@qwelukasz: Na Swifcie leć w MVVM/MVVM-C
Odnośnie SwiftUI, to minimalny sensowny target to iOS 14, poniżej tego nie ma co schodzić, bo się pochlastasz zanim zrobisz coś sensownego.
Musiałbym dokładnie przeczytać artykuł tego kolesia na temat tego, że SwiftUI nie dogaduje się z MVVM, ale u siebie w produkcie produkcyjnym taki zestaw mam i polecam.
Możesz też rozważyć np. UIKit. Mniej nowocześnie, ale można uznać że bezpieczniej, bo dużo więcej materiałów
@Prism2772: super, dzieki za odpowiedz

co do struktury, tutaj koles tak to ogarnia:
https://www.youtube.com/watch?v=i66xMrpIgYA

tworzy grupy:
Models / repositories / services / ViewModels / Models

Pewnie nie ma jakiejś jednej właściwej konwencji ale z doświadczenia pewnie wiesz że jedna jest bardziej praktyczna od drugiej..

mam jeszcze pytania:
- wszystkie pliki muszą mieć unikalną nazwę? Nie mogę mieć 2 różnych grup (folderów) i w każdej plik o nazwie TopBanner ale z inną
@qwelukasz: Główna kwestia jak zrobić foldery w projekcie, to tak aby było wygodnie. To i tak nie ma wpływu na czas kompilacji. A plik pbxproj i tak będzie wyglądał tragicznie.
Sam mam w projekcie podzielone po features. W tym zazwyczaj folder viewModels pod modele, views pod widoku, resources pod assety i helpers pod dodatki w stylu serwisu sieciowego.
Ale najważniejsze to jest aby Ci się wygodnie po tym poruszało.
Jeśli chodzi
@Prism2772:

Tabcontroller to da solna sekcja. Mnie zastanawia jak najlepiej zrobić ta górna gdzie masz napis „moje Allegro” oraz zakupy / lokalne / konto
Tylko dolna cześć byłaby dynamiczna w zależności od widoku

Pokażesz przykład jak zrobić jakiś prosty extension widoku? Na przykładzie tego top banner - albo jakiś link do tutoriala
@Prism2772: I jeszcze jedno mi powiedz. Załóżmy ze mam jakiś customowy font w apce. Chce aby każdy tect/button go używał.
Musze do każdego elementu ustawiać font, zrobić swój komponent rozszerzając ten domyślny czy da się jakoś globalnie ustawić ze ma być wszędzie Comic-Sans? ;)
@qwelukasz: Sam napis "Moje Allegro" to pewnie navigation controller title by było, a do tych przycisków sam używam tego

https://github.com/uias/Tabman
Nie wiem czy to najlepsza opcja, ale u mnie działa spoko :D

Najłatwiej będzie chyba odesłać do dokumentacji

https://docs.swift.org/swift-book/LanguageGuide/Extensions.html
Albo tutorial

https://blog.logrocket.com/swift-extensions-an-overview-with-examples/

Jeśli chodzi o jakieś fragmenty kodu, możesz się jutro w trakcie dnia odezwać, bo teraz już nie chce do komentowania pa siadać.

Jeśli chodzi o font, to mam rozszerzenie
Musze do każdego elementu ustawiać font, zrobić swój komponent rozszerzając ten domyślny czy da się jakoś globalnie ustawić ze ma być wszędzie Comic-Sans? ;)


@qwelukasz: tak jak piszesz - najlepiej zrobić swój komponent rozszerzający istniejący.

Mnie zastanawia jak najlepiej zrobić ta górna gdzie masz napis „moje Allegro” oraz zakupy / lokalne / konto

Tak naprawdę mogą to być nawet 3 zwykłe buttony. Zawartości tych zakładek pod nimi zawierasz w oddzielnych widokach
  • 0
@Prism2772: Tabman to jest to czego szukałem! Dzięki

co do fragmentów kodu,

jeśli to nie problem dla Ciebie to bardzo pomocny dla mnie byłby jakiś prosty MVVC gdzie masz:
kontroler / widok + fetchowanie danych z API

Zastanawiam się czy jak pobiorę dane z APi to mają one być trzymane w state danego komponentu/repozytorium czy właśnie w core data - zakładając, że przy każdym odpaleniu apki i tak muszę fetchować na
@qwelukasz: MVC czy MVVM? :D
Jeśli chodzi o taką apkę, która musi fetchować dane co 5 minut, czy ogólnie musi mieć świeże po odpaleniu, to nawet bym nie myślał aby angażować CoreData

Wrzucasz w jakąś zmienną w kodzie(najlepiej jakiś data source, który jest wywoływany z view modelu) i na podstawie tego data source możesz operować tymi danymi jak potrzebujesz

Nie wiem czy sam to ogarnę, bo jednak to jest chwila aby
  • 0
@Prism2772: siema, to znowu ja ;-)

Powiedz mi jeszcze, czeog używasz do odtwarzania wideo? Testuję AVPlayer ale mam z nim drobne problemy, np nie wiem jak zrobić aby po wyściu z pełnego ekranu nadal odtwarzało się wideo (obecnie się zatrzymuje)
@qwelukasz: AVPlayera, ale akurat w apce nad którą pracuje nie mam zaimplementowanego full screena. Z tego co pamiętam to chyba delegat jest w stanie wykryć wyjście z full screena i wtedy można odpalić znowu odtwarzanie. Piszę z głowy więc dokładnie nie pamiętam. Jakby nie udało Ci się znaleźć to daj znać, będąc przy kompie poszukam rozwiązania
  • 0
@Prism2772: zobacz prosze, dzisiaj caly dzien nad tym gownem siedzialem i nie dziala mi to
tyle mam poki co

struct VideoPlayerView: UIViewControllerRepresentable {
let videoUrl: URL

func makeUIViewController(context: Context) -> AVPlayerViewController {
let controller = AVPlayerViewController()
let player = AVPlayer(url: videoUrl)
controller.player = player
controller.exitsFullScreenWhenPlaybackEnds = true

return controller
}

func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {

}
}
@qwelukasz: Ten fragment kodu

controller.exitsFullScreenWhenPlaybackEnds = true
Nie oznacza, że w momencie kiedy zakończy się odtwarzanie elementu, to wtedy automatycznie wyjdzie z full screena. Nie mówi nic o zachowaniu jakie ma się zdarzyć po wyjściu użytkownika z odtwarzacza.
Spróbuj zrobić coś takiego.

controller.delegate = self

extension VideoPlayerView: AVPlayerCOntrollerDelegate {

func playerViewController(_ playerViewController: AVPlayerViewController, willEndFullScreenPresentationWithAnimationCoordinator coordinator: UIViewControllerTransitionCoordinator) {

coordinator.animate(alongsideTransition: nil) { transitionContext in
self.playerViewController?.player.play()
}
}

To powinno wykryć wyjście z fullscreena