рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЙрдиреНрдирдд рдкрд╛рдареНрдпрдХреНрд░рдо "рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░" рдХреЗ рд▓реЙрдиреНрдЪ рдХреА рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдкрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред
рдирдорд╕реНрдХрд╛рд░ рдФрд░ рд╣рдорд╛рд░реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ! рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рд╣рдо рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреИрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВ (рдиреЗрд╡рд┐рдЧреЗрд╢рди рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛!)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рддреБрдЪреНрдЫ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдордЭрдиреЗ рдкрд░, рд╣рдо рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВредрдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП @ObservableObject
ред рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ @EnvironmentObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреЗрдВрдЧреЗред рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рдВрдХреНрд░рдордг рдПрдиреАрдореЗрд╢рди рдХреЛ рднреА рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВредрдпрд╣рд╛рдБ рд╣рдо рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЕрднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рдУрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдУрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреИрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╡реНрдпреВ рд░рд╛рдЙрдЯрд░ рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕реЗ рдорджрд░ рд╡реНрдпреВ рдФрд░ рд╣рдорд╛рд░реЗ рдХрдВрдЯреЗрдВрдЯ рд╡реНрдпреВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдХрд░рдВрдЯ рд╡реНрдпреВ рд╡реНрдпреВ рд░рд╛рдЙрдЯрд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MotherView рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рддрд░реАрдХрд╛ рд╣реИ: рдЙрдкрдпреЛрдЧ @EnvironmentObject
!рд╕рдВрдХреЗрдд: рдЖрдк рдпрд╣рд╛рдВ рдирд╡реАрдирддрдо рдШрдЯрдирд╛рдХреНрд░рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ "NavigateInwiftUIComplete" рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ) : HitHubрдХреНрдпреЛрдВ рдЙрдкрдпреЛрдЧ ObservableObject
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ
рдЖрдк рд╢рд╛рдпрдж рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ: рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ? рдареАрдХ рд╣реИ, рдпрджрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рддрд░реНрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░рд╛ MotherView рд░реВрдЯ рджреГрд╢реНрдп рд╣реИ рдЬреЛ ViewRouter рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред MotherView рдореЗрдВ, рд╣рдо ContentViewA рдФрд░ ContentViewB рдХреЛ рднреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ ViewRouter рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдПрдХ BindableObject рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВредрдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рд╕рдЦреНрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рднреА рд╕рдмрд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдСрдмрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдЕрдм рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рд╣рдореЗрдВ рд╕рднреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ рдФрд░ рд╕рднреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ, рдЖрджрд┐ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЕрд╡рд▓реЛрдХрди рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рдПрдХ рдХрдард┐рди рдХрд╛рд░реНрдп рдмрди рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: ObservableObject
рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдмрд╛рдд рдЖрдиреЗ рдкрд░ рд╕реНрд╡рдЪреНрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╡реНрдпреВ рд░рд╛рдЙрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рднреА рджреГрд╢реНрдп рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕реАрдзреЗ рдЬреБрдбрд╝реЗ рд╣реЛ рд╕рдХреЗрдВ, рдпрд╛, рдмрд▓реНрдХрд┐, рдЗрд╕реЗ рджреЗрдЦреЗрдВ, рдЪрд╛рд╣реЗ рдЖрд╡реЗрджрди рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реЛред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ViewRouter рдЙрджрд╛рд╣рд░рдг рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХреЛрдб рдкрд░ рдЙрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рджрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рджреГрд╢реНрдп рдкрджрд╛рдиреБрдХреНрд░рдо рдиреАрдЪреЗ рд╕рд╣реА рдЖрд░рдВрднреАрдХрд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рднреА рджреГрд╢реНрдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВредрдпрд╣ рд╕рд┐рд░реНрдл рдХрд╛рдо рд╣реИ EnvironmentObject
!рдХреНрдпрд╛ рд╣реИ EnvironmentObject
?
EnvironmentObject
рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реИ, рдЬреЛ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рднреА рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ EnvironmentObject
рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ObservableObject
, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ ViewRouter
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ EnvironmentObject
!рдЬреИрд╕реЗ рд╣реА рд╣рдордиреЗ рдЕрдкрдирд╛ рдШреЛрд╖рд┐рдд ViewRouter
рдХрд┐рдпрд╛ EnvironmentObject
, рд╕рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ObservableObject
, рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рдкрджрд╛рдиреБрдХреНрд░рдо рдиреАрдЪреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░рдореНрдн рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛!рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ EnvironmentObject
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ MotherView
, рд░реВрдЯ рджреГрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдВрдкрддреНрддрд┐ рдХреЛ рджреЗрдЦреЗрдЧрд╛ CurrentPage
ViewRouter
, рдЗрд╕рд▓рд┐рдП EnvironmentObject
рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рддрдм рд╣рдо рдХрд░рдВрдЯрдкреЗрдЬ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВEnvironmentObject
рдХреА ContentView
рд╣реИ, рдЬреЛ рддрдм рдХреЙрд▓ MotherView
рдлрд┐рд░ рд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдПред
рдХреЗ ViewRouter
рд░реВрдк рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрдиEnvironmentObject
рддреЛ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ!рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЖрд╡рд░рдг рдмрджрд▓ viewRouter
рдЕрдВрджрд░ MotherView
рд╕реЗ @ObservableObject
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @EnvironmentObject
редimport SwiftUI
struct MotherView : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
}
}
рд╕рдВрдкрддреНрддрд┐ viewRouter
рдЕрдм рд▓рдЧ рд░рд╣реА рд╣реИ ViewRouter-EnvironmentObject
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ MotherView_Previews
рдЙрдЪрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :#if DEBUG
struct MotherView_Previews : PreviewProvider {
static var previews: some View {
MotherView().environmentObject(ViewRouter())
}
}
#endif
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕реЗ рддреБрд░рдВрдд ViewRouter
рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП EnvironmentObject
, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ MotherView
рдЕрдм рд░реВрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ EnvironmentObject
ред рдЗрд╕рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рджреГрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди SceneDelegage.swift
рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ :func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: MotherView().environmentObject(ViewRouter()))
self.window = window
window.makeKeyAndVisible()
}
}
рдорд╣рд╛рди, рдЕрдм рдЬрдм рдЖрдк рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ SwiftUI ViewRouter
рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ EnvironmentObject
, рдЬрд┐рд╕рд╕реЗ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рд╡рд┐рдЪрд╛рд░ рдЕрдм рд╕рдВрд▓рдЧреНрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВредрдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░рд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ContentViewA
ред рдЗрд╕рдХреА viewRouter
рд╕рдВрдкрддреНрддрд┐ рдмрджрд▓реЗрдВ EnvironmentObject
рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ContentViewA_Previews
редimport SwiftUI
struct ContentViewA : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
}
}
#if DEBUG
struct ContentViewA_Previews : PreviewProvider {
static var previews: some View {
ContentViewA().environmentObject(ViewRouter())
}
}
#endif
рд╕рдВрдХреЗрдд: рдлрд┐рд░ рд╕реЗ, рд╕рдВрд░рдЪрдирд╛ ContentViewsA_Previews
рдХрд╛ рдЕрдкрдирд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ ViewRouter
, рд▓реЗрдХрд┐рди ContentViewA
рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ!рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдПрдВ ContentViewB
:import SwiftUI
struct ContentViewB : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
}
}
#if DEBUG
struct ContentViewB_Previews : PreviewProvider {
static var previews: some View {
ContentViewB().environmentObject(ViewRouter())
}
}
#endif
рдЪреВрдВрдХрд┐ viewRouter
рд╣рдорд╛рд░реЗ рдЧреБрдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ ContentView
рдЕрдм рд╕реАрдзреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд / рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди ViewRouter
рдХреЗ рд░реВрдк рдореЗрдВ EnvironmentObject
, рд╣рдо рдЕрдм рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░рд╛ рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ MotherView
ред рддреЛ, рдЪрд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рд╣рдорд╛рд░рд╛ MotherView
:struct MotherView : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
VStack {
if viewRouter.currentPage == "page1" {
ContentViewA()
} else if viewRouter.currentPage == "page2" {
ContentViewB()
}
}
}
}
рдпрд╣ рд╕рд┐рд░реНрдл рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ: рд╣рдореЗрдВ рдЕрдм ViewRouter
рд╣рдорд╛рд░реЗ рдЕрдВрджрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ MotherView
рдФрд░ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ ContentView рдХреЗ рдкрд╛рд╕ рднреЗрдЬ рджреЗрдВ, рдЬреЛ рдмрд╣реБрдд рд╣реА рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрджрд╛рдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдПредрдорд╣рд╛рди, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдорд╣рд╛рди, рд╣рдо рдЕрднреА рднреА рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ!рд╕рдВрдХреНрд░рдордг рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдирд╛
рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ "рдкреЗрдЬ 1" рд╕реЗ "рдкреЗрдЬ 2" тАЛтАЛрдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕рдВрдХреНрд░рдордг рдПрдиреАрдореЗрд╢рди рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПредSwiftUI рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИредрдХреЛ рджреЗрдЦреЛ willChange
рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ ViewRouter.swift
рдЬрдм CurrentPage
рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ MotherView
рдЖрдкрдХреЗ рд╢рд░реАрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдВрдзрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ , рдЕрдВрддрддрдГ рдПрдХ рдФрд░ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ ContentView
, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдирд╛ ContentView
ред рд╣рдо willChange
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ withAnimation
:var currentPage: String = "page1" {
didSet {
withAnimation() {
willChange.send(self)
}
}
}
рдЕрдм рд╣рдо рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕рдВрдХреНрд░рдордг рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ Content View
ред"WithAnimation (_: _ :) - рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдирд┐рдХрд╛рдп рдХреЗ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ"
Apple
рд╣рдо рдЬрдм рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдПрдХ рдкреЙрдк-рдЕрдк рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ContentViewA
рдХреЗ рд▓рд┐рдП ContentViewB
ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВ MotherView.swift
рдФрд░ рдЬрдм рдХрд╣рд╛ рдЬрд╛рдП рддреЛ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝реЗрдВ ContentViewB
ред рдЖрдк рдХрдИ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрдХреНрд░рдордг рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ)ред рдкреЙрдк-рдЕрдк рд╕рдВрдХреНрд░рдордг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ .scale
редvar body: some View {
VStack {
if viewRouter.currentPage == "page1" {
ContentViewA()
} else if viewRouter.currentPage == "page2" {
ContentViewB()
.transition(.scale)
}
}
}
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рдпрдорд┐рдд рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдЪрд▓рд╛рдПрдВ: рдХреВрд▓, рд╣рдордиреЗ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣реА рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХреНрд░рдордг рдПрдиреАрдореЗрд╢рди рдЬреЛрдбрд╝рд╛!рдЖрдк рдпрд╣рд╛рдБ рд╕рднреА рд╕реЛрд░реНрд╕ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ !рдирд┐рд╖реНрдХрд░реНрд╖
рдмрд╕ рдЗрддрдирд╛ рд╣реА! рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ EnvironmentObject
рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ , рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдордиреЗ рдпрд╣ рднреА рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ Instagram рдкрд░ рдлреЙрд▓реЛ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВ рддрд╛рдХрд┐ SwiftUI рдкрд░ рдЕрдкрдбреЗрдЯ, рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдпрд╛рдж рди рдХрд░реЗрдВ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ!
рдирд┐: рд╢реБрд▓реНрдХ рд╕рдмрдХ: "рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдЖрдИрдУрдПрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди"