$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
モーダルの遷移を理解する
Search
Yuki Yasoshima
August 29, 2023
Programming
4
2.4k
モーダルの遷移を理解する
iOSDC Japan 2023
2023年9月1日
Yuki Yasoshima
August 29, 2023
Tweet
Share
More Decks by Yuki Yasoshima
See All by Yuki Yasoshima
Swift Concurrency - 状態監視の罠
objectiveaudio
2
640
Swift Concurrencyとレースコンディション
objectiveaudio
2
730
オーディオ波形を表示するために知っておくべきこと
objectiveaudio
0
1k
AVAudioEngineでリアルタイムレンダリング
objectiveaudio
1
870
リファクタリング・チャレンジ リバーシ編
objectiveaudio
0
180
UIKitは2度ベルを鳴らす
objectiveaudio
0
320
iOSDC2018.pdf
objectiveaudio
1
2.3k
Objective-C++を使ってMRCで快適に開発する
objectiveaudio
0
23k
Other Decks in Programming
See All in Programming
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
310
愛される翻訳の秘訣
kishikawakatsumi
3
340
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
150
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
190
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
250
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
130
Deno Tunnel を使ってみた話
kamekyame
0
220
tparseでgo testの出力を見やすくする
utgwkk
2
270
ゲームの物理 剛体編
fadis
0
370
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
140
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
150
エディターってAIで操作できるんだぜ
kis9a
0
750
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
56
14k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Bash Introduction
62gerente
615
210k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
81
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
65
35k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
1.9k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
89
Information Architects: The Missing Link in Design Systems
soysaucechin
0
710
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
0
99
How to Think Like a Performance Engineer
csswizardry
28
2.4k
GitHub's CSS Performance
jonrohan
1032
470k
Transcript
ϞʔμϧͷભҠΛཧղ͢Δ :VLJ:BTPTIJNB !ZBTP@TBO
͡Ίʹ w ͕͍࣌ؒͷͰɺओʹ4XJGU6*ʹߜͬͯ͠·͢ w ಛʹݴٴ͍ͯ͠ͳ͚ΕɺJ04J1BE04ͷγϛϡϨʔλͰಈ࡞֬ೝͨ͠ ڍಈΛͱʹ͍ͯ͠·͢
͢͜ͱ w Ϟʔμϧʹ͍ͭͯ w Ϟʔμϧͷ w ϞʔμϧͷΛղܾ͢Δ
͜ͷτʔΫͰ͏༻ޠ
Ϟʔμϧ w ͜ͷτʔΫͰJ04ͷը໘શମͷ্ʹ෴ͬͯผͷը໘Λલ໘ʹදࣔ͢ΔػೳΛ ද͢ w 4IFFU"MFSUͳͲͷ͜ͱ w ࣙॻతͳҙຯؾʹ͠ͳ͍
σʔλιʔε w !4UBUF0CTFSWBCMF0CKFDUɺ͞Βʹͦͷઌʹ͋Δ7JFXΛදࣔ͢ΔͨΊͷ σʔλ w ͜ͷτʔΫͰɺ7JFXͱσʔλιʔε͘Β͍ͷϨΠϠʔ͚Ͱ͢
Ϟʔμϧʹ͍ͭͯ
Ϟʔμϧͷछྨ w 4IFFU w 'VMM4DSFFO$PWFS w "MFSU w 1PQPWFS w
$PO fi SNBUJPO%JBMPHʢ"DUJPO4IFFUʣ w .FOV1JDLFS
Ϟʔμϧͷ֊ w Ϟʔμϧʹ֊͕͋Δ w 4IFFUɾ'VMM4DSFFO$PWFSɾ1PQPWFSෳ֊ੵΈॏͶΒΕΔ
ϧʔτͷ6*֊ 5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU 8JOEPX Ϟʔμϧͷ֊ 4IFFUͷ߹
Ϟʔμϧୈ֊ 5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU ։͘ 8JOEPX Ϟʔμϧͷ֊
4IFFUͷ߹ ϧʔτͷ6*֊ 5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU
Ϟʔμϧୈ֊ 5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU 8JOEPX 5BC /BWJHBUJPO
7JFX 5FYU *NBHF -JTU Ϟʔμϧͷ֊ 4IFFUͷ߹ ❌։͚ͳ͍ ϧʔτͷ6*֊
Ϟʔμϧୈ֊ Ϟʔμϧୈ֊ 5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU ։͘ 8JOEPX
5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU Ϟʔμϧͷ֊ 4IFFUͷ߹ ϧʔτͷ6*֊
5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU 8JOEPX Ϟʔμϧͷ֊ 4IFFUͷ߹ ด͡Δ
ϧʔτͷ6*֊
5BC /BWJHBUJPO 7JFX 5FYU *NBHF -JTU 8JOEPX Ϟʔμϧͷ֊ 4IFFUͷ߹ ❌
ด͡Εͳ͍ ϧʔτͷ6*֊
Ϟʔμϧͷର w 1PQPWFSɾ$PO fi SNBUJPO%JBMPHͳͲ ࢦࣔ͢͠ઌͷ7JFX͕ඞཁ w 4IFFUɾ'VMM4DSFFO$PWFSɾ"MFSUͳͲ ը໘શମ͔Βग़Δʢಉ͡֊Ͱ͋Ε NPEJ
fi FSΛ͚Δ7JFXͲ͜ʹͯ͠ಈ ࡞ʹҧ͍ͳ͍ʣ
ϞʔμϧͷભҠͷίʔυ JT1SFTFOUFE struct ContentView: View { @State var isPresented: Bool
= false var body: some View { Button(“Show") { isPresented = true } .sheet(isPresented: $isPresented) { ... } } } όΠϯυͨ͠Λมߋ͢ΔͱભҠ #PPMͷΛόΠϯυ͢Δ
ϞʔμϧͷભҠͷίʔυ JUFN struct ContentView: View { @State var item: Item?
= nil var body: some View { Button("Show Sheet") { item = .foo } .sheet(item: $item) { ... } } } όΠϯυͨ͠Ληοτ͢ΔͱભҠ ҙͷ0QUJPOBMͷΛόΠϯυ͢Δ
։͘ ด͡Δ ด͡ऴΘΔ ભҠͷ࣌ؒ࣠ͷྲྀΕ ભҠͷঢ়ଶ JT1SFTFOUFEGBMTF ։͖ऴΘΔ JT1SFTFOUFEUSVF
։͘ ด͡Δ ด͡ऴΘ͔ͬͯΒग़Δ ͔ ϞʔμϧදࣔதͷભҠ ભҠͷঢ়ଶ ଞͷϞʔμϧग़ͤͳ͍
खಈͰด͡Δ w ϞʔμϧͷछྨʹΑͬͯɺεϫΠϓϘλϯλοϓͳͲͰด͡ΒΕΔ w 4IFFUˠεϫΠϓ w "MFSUͳͲˠϘλϯλοϓ w 1PQPWFSͳͲˠ֎ଆΛλοϓ
.FOV w બࢶͷ6*1PQPWFSతͳϞʔμϧͷ Ұछ w JT1SFTFOUFEͳͲͳ͘ɺϢʔβʔૢ ࡞ͰͷΈભҠ͢Δ
։͖ํ ด͡ํ ্ͷ֊ දࣔઌͷ7JFX 4IFFU όΠϯυ όΠϯυ εϫΠϓ ։͚Δ ͍Βͳ͍
'VMM4DSFFO$PWFS όΠϯυ όΠϯυ ։͚Δ ͍Βͳ͍ 1PQPWFS όΠϯυ όΠϯυ ֎Λλοϓ ։͚Δ ͍Δ "MFSU όΠϯυ όΠϯυ Ϙλϯબ ։͚ͳ͍ ͍Βͳ͍ $PO fi SNBUJPO %JBMPH όΠϯυ όΠϯυ Ϙλϯબ ։͚ͳ͍ ͍Δ .FOV λοϓ Ϙλϯબ ֎Λλοϓ ։͚ͳ͍ Ϟʔμϧͷछྨ
ϞʔμϧͰΓͨ͘ͳΔ͜ͱ w %FFQ-JOLඇಉظॲཧͷྃ࣌ͳͲɺϢʔβʔૢ࡞Ҏ֎ͷλΠϛϯάͰϞ ʔμϧͷભҠΛ͍ͨ͠ w ϞʔμϧͷσʔλιʔεΛมߋͨ͠Βɺͦͷঢ়ଶ͕ͦͷ··6*ʹө͞ΕΔΑ ͏ʹ͍ͨ͠ w ͦΕΒΛ࣮ݱ͠Α͏ͱ͢Δͱɺ৭ʑ͕ى͖Δ
Ϟʔμϧͷ
var body: some View { Button("Show") { isFirstPresented = true
isSecondPresented = true isThirdPresented = true } .sheet(isPresented: $isFirstPresented) { Text("1") .sheet(isPresented: $isSecondPresented) { Text("2") .sheet(isPresented: $isThirdPresented) { Text("3") } ... ֊Ҏ্ಉ࣌ʹ։͚ͳ͍ ❌ͭ։͔ͳ͍
J04Ҏલෳ֊ಉ࣌ʹด͡Εͳ͍ var body: some View { Button("Show") { ... }
.sheet(isPresented: $isFirstPresented) { Text("1") .sheet(isPresented: $isSecondPresented) { Button("Close") { isFirstPresented = false } ... J040, ❌J04શ෦ด͡ͳ͍
var body: some View { ... .sheet(isPresented: $isSheetPresented) { Button("Switch
to FullScreen") { isSheetPresented = false isFullPresented = true } } .fullScreenCover( isPresented: $isFullPresented) { Text("Full Screen") } } ϞʔμϧͷΓସ͑ 'VMM4DSFFO͕4IFFUͰදࣔ͞ΕΔ ❌4IFFUͰදࣔ͞ΕΔ
var body: some View { ... .sheet(isPresented: $isSheetPresented) { Button("Show
Alert") { isSheetPresented = false isAlertPresented = true } } .alert("Alert", isPresented: $isAlertPresented) { ... } } ϞʔμϧͷΓସ͑ "MFSU͕දࣔ͞Εͳ͍ ❌දࣔ͞Εͳ͍
ϞʔμϧͷΓସ͑ 1PQPWFSܥ w ਧ͖ग़͠ͷ֎ଆԼͷ֊ͷ7JFXʹ λοϓ͕௨Δ w 1PQPWFSΛ։͍ͨ··ɺ4IFFUΛλοϓ ͯ͠։͜͏ͱͯ͠։͚ͳ͍ w σʔλιʔεͱ7JFXͷ߹ੑ͕औΕͳ
͘ͳΔͱͱ։͚ͳ͘ͳΔ ❌λοϓͰ͖Δ͕ 4IFFUදࣔ͞Εͳ͍
var body: some View { Button("Freeze") { isFirstPresented = true
isSecondPresented = true Task { try await Task.sleep(for: .milliseconds(100)) isFirstPresented = false } } .sheet(isPresented: $isFirstPresented) { ... .sheet(isPresented: $isSecondPresented) { ... } ભҠதʹด͡Α͏ͱ͢ΔͱϑϦʔζ ❌ϑϦʔζ͢Δ
var body: some View { Button("Crash") { item = .one
Task { try await Task.sleep(for: .milliseconds(100)) item = .two try await Task.sleep(for: .milliseconds(100)) item = .three } } .sheet(item: $item, content: { item in ... }) } ϞʔμϧΓସ͑தʹ͞ΒʹΓସ͑ΔͱΫϥογϡ ❌Ϋϥογϡ͢Δ
ϞʔμϧͷΛղܾ͢Δ
ํ w σʔλιʔεͰϞʔμϧͷঢ়ଶΛηοτͨ͠Βɺͦͷ··6*ʹө͞ΕΔΑ͏ ʹ͍ͨ͠ w J04Ҏ߱Λରʹͯ͠ด͡Δ࣌ͷΛճආ w ϞʔμϧͷભҠதʹผͷભҠ͕ߦΘΕͳ͍Α͏ʹͯ͠Λճආ w .FOVͷϞʔμϧ͕։͍͍ͯͯଞͷϞʔμϧ͕։͚ΔΑ͏ʹ͢Δ
enum Modal { case sheet(Item) case alert(...) ... } σʔλιʔε
.PEBM 7JFX 1PQPWFS OJM "MFSU OJM 4IFFU OJM Ϟʔμϧͷঢ়ଶΛͭͷͰද͢ ม 1PQPWFS OJM OJM
enum Modal { case sheet(Item) case alert(...) ... } σʔλιʔε
.PEBM TIFFU GPP 7JFX 1PQPWFS OJM "MFSU OJM 4IFFU GPP Ϟʔμϧͷঢ়ଶΛͭͷͰද͢ ม 1PQPWFS OJM
enum Modal { case sheet(Item) case alert(...) ... } σʔλιʔε
.PEBM BMFSU CBS 7JFX 1PQPWFS OJM "MFSU CBS 4IFFU OJM Ϟʔμϧͷঢ়ଶΛͭͷͰද͢ ม 1PQPWFS OJM
σʔλιʔεͷөΛΒͤΔ ։͘ ด͡Δ ։͘ ݩσʔλ όΠϯυ͢Δσʔλ CBS ભҠͷঢ়ଶ OJM OJM
GPP GPP CBS OJM
σʔλιʔεͷөΛΒͤΔ ։͘ ด͡Δ ։͘ ݩσʔλ όΠϯυ͢Δσʔλ GPP CBS OJM GPP
OJM IPH ભҠͷঢ়ଶ IPH OJM
։͘ ด͡Δ ։͘ ݩσʔλ όΠϯυ͢Δσʔλ GPP OJM OJM CBS σʔλιʔεͷөΛΒͤΔ
ભҠͷঢ়ଶ OJM CBS GPP
.FOVΛͳΜͱ͔͢Δ w JT1SFTFOUFEͳ͍͕ɺͷ7JFX͔Β .FOVΛফ͢͜ͱͰਧ͖ग़͠Λඇදࣔʹ Ͱ͖Δ w ϞʔμϧΛදࣔ͢Δલʹ.FOVΛೖΕସ ͑ͯด͓ͯ͘͡ struct MenuView:
View { ... var body: some View { if flag { Menu(...) } else { Menu(...) } } }
.FOVΛดͨ͡ޙͷભҠ w .FOVΛೖΕସ͑ͨͷͱಉ࣌ʹผͷϞʔμϧΛදࣔ͠Α͏ͱͯ͠ɺදࣔ͞ Εͳ͍͜ͱ͕͋Δ w .FOVΛด͔ͯ͡ΒϞʔμϧͷભҠΛ։࢝͢Δ·Ͱʹগؒ͠Λ։͚Δ
7JFXͷߋ৽ 4XJGU6*ͷ7JFXͷߋ৽αΠΫϧ 7JFX͕ߋ৽͞ΕΔλΠϛϯά
σʔλιʔεͷมߋ σʔλιʔεͷมߋ σʔλιʔεͷมߋ 4XJGU6*ͷ7JFXͷߋ৽αΠΫϧ 7JFXͷߋ৽ ఆظతʹ·ͱΊͯσʔλΛ औಘͯ͠ɺ͕ࠩ͋Ε 7JFX͕ߋ৽͞ΕΔ
.FOVඇදࣔޙͷϞʔμϧөλΠϛϯά ❌ ⭕ 7JFXͷߋ৽ .FOVΛด͡Δ ࣮ࡍʹ.FOV͕ด͡ΒΕΔ ผͷϞʔμϧͷ ࣮ࡍͷදࣔ։࢝
ભҠͷλΠϛϯάऔಘ 4IFFU'VMM4DSFFO$PWFS1PQPWFS ։͘ ด͡Δ ભҠͷঢ়ଶ 7JFX$POUSPMMFSͷ WJFX%JE"QQFBS Ϟʔμϧͷ PO%JTBQQFBS
ભҠͷλΠϛϯάऔಘ ։͘ ด͡Δ ભҠͷঢ়ଶ "MFSU$PO fi SNBUJPO%JBMPH PO"QQFBS PO%JTBQQFBS ඵ͘Β͍
ભҠͷλΠϛϯάऔಘ ։͘ ด͡Δ ભҠͷঢ়ଶ "MFSU$PO fi SNBUJPO%JBMPH PO"QQFBS PO%JTBQQFBS Ϙλϯλοϓ͞ΕͨΒ
ڧ੍తʹดͨ͜͡ͱʹ͢Δ ඵ͘Β͍
·ͱΊ Ϟʔμϧͷ w Ϟʔμϧ͕։͚ͳ͍ͱͱ։͚ͳ͘ͳΔ w σʔλιʔεΛมߋ͢ΔλΠϛϯάʹΑͬͯΫϥογϡϑϦʔζ͕ى͖Δ w J04ҎલͰෳ֊ͷϞʔμϧΛಉ࣌ʹด͡Εͳ͍ w .FOVʹભҠͷঢ়ଶΛཧ͢Δ"1*͕ͳ͍
·ͱΊ Ϟʔμϧͷͷղܾ w J04Ҏ߱ʹݶఆ͢Δʢด͡Δͷָ͕ʣ w ಉ͡֊ͷϞʔμϧͷσʔλιʔεΛͭʹ·ͱΊΔ w ϞʔμϧભҠதผͷભҠΛ͡Ίͳ͍ w .FOVͷ7JFX͔ΒೖΕସ͑ͯด͡ɺ࣍ͷϞʔμϧͷભҠ։࢝ΛΒͤΔ
αϯϓϧίʔυ Ϟʔμϧͷͷ࠶ݱ IUUQTHJUIVCDPNPCKFDUJWFBVEJP.PEBM1SPCMFN ϞʔμϧͷΛղܾͨ͠ྫ IUUQTHJUIVCDPNPCKFDUJWFBVEJP.PEBM"SDIJUFDUVSF