рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ "рдЖрдИрдУрдПрд╕" рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ "рд╕рдордиреНрд╡рдпрдХреЛрдВ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡

рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рджреБрдирд┐рдпрд╛ рдкреНрд░рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдореГрджреНрдз рд╣реИ, рдФрд░ рдпрд╣ "iOS" рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рджреЛрдЧреБрдирд╛ рд╕рдЪ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рдорд╛рдирдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдБ рдХрд┐ рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд╕рдмрд╕реЗ "рдлреИрд╢рдиреЗрдмрд▓" рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкреИрдЯрд░реНрди рдореЗрдВ рд╕реЗ рдПрдХ "рд╕рдордиреНрд╡рдпрдХ" рд╣реИред рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд╣рдорд╛рд░реА рдЯреАрдо рдХреЛ рдЦреБрдж рдкрд░ рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдЖрдЬрдорд╛рдиреЗ рдХреА рдПрдХ рдЕрдердХ рдЗрдЪреНрдЫрд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рдмрджрд▓ рдЧрдпрд╛ - рддрд░реНрдХ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рдХреБрд▓ рдкреБрди: рдпреЛрдЬрдирд╛ред

рд╕рдорд╕реНрдпрд╛


рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВ: "рдХрдорд╛рдВрдб рдХрдорд╛рдВрдб рджреЗрдВ" рд╕реАрдзреЗ UINavigationController , "рд╕рдВрдЪрд╛рд░" рдЕрдкрдиреЗ "рднрд╛рдЗрдпреЛрдВ" рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реНрдЯреИрдХ рдкрд╛рд╕ рдХрд░реЗрдВ) - рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ рдЗрд╕рд╕реЗ рднреА рдЙрдиреНрд╣реЗрдВ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ "рд╕рдордиреНрд╡рдпрдХ" рдареАрдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рд╣реИ: рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЛрдиреЛрдВ рдЫреЛрдЯреЗ рдореЙрдбреНрдпреВрд▓ (рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рд╢рд╛рдпрдж, рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд╕реНрдХреНрд░реАрди) рдХреА рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдФрд░ рдкреВрд░реЗ рдЖрд╡реЗрджрди (рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ "рдкреНрд░рд╡рд╛рд╣" рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реБрдП, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдмреЛрд▓, рд╕реАрдзреЗ UIApplicationDelegate )ред

рдХрд╣рд╛рдиреА


рдорд╛рд░реНрдЯрд┐рди рдлрд╛рдЙрд▓рд░ рдиреЗ рдЕрдкрдиреА рдкреБрд╕реНрддрдХ рдкреИрдЯрд░реНрди рдСрдлрд╝ рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдПрдкреНрд▓реАрдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╣рд╛ рд╣реИред рдФрд░ "рдЖрдИрдУрдПрд╕" рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдЙрдирдХрд╛ рдкрд╣рд▓рд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рд▓рд╛рд╣рдХрд╛рд░ рд╕реЛрд░рд╢ рдЦрд╛рдирд▓реВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рд╕рдм 2015 рдореЗрдВ "рдПрдирдПрд╕рдПрд╕рдкреИрди" рдкрд░ рдЕрдкрдиреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖред рдлрд┐рд░ рдЙрдирдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рд▓реЗрдЦ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╕реАрдХреНрд╡реЗрд▓ рдереЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ )ред

рдФрд░ рдлрд┐рд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЧрдпрд╛ ("рдЖрдИрдУрдПрд╕ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯрд░" рдХреНрд╡реЗрд░реА рдиреЗ рд╡рд┐рднрд┐рдиреНрди рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рджрд░реНрдЬрдиреЛрдВ рдкрд░рд┐рдгрд╛рдо рджрд┐рдП), рдЬрд┐рд╕рдореЗрдВ рд░реЗ рд╡реЗрдВрдбрд░рд▓рд┐рдЪ рдкрд░ рдПрдХ рдЧрд╛рдЗрдб рдФрд░ рдкреЙрд▓ рд╣рдбрд╕рди рдХреЗ рдЕрдкрдиреЗ "рд╣реИрдХрд┐рдВрдЧ рд╡рд┐рде рд╕реНрд╡рд┐рдлреНрдЯ" рдкрд░ рдПрдХ рд▓реЗрдЦ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛ рдЬрд╛рдПред "рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░" рдирд┐рдпрдВрддреНрд░рдХред

рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдЪрд░реНрдЪрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡рд┐рд╖рдп UINavigationController рдореЗрдВ рдмреИрдХ рдмрдЯрди рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рд╣рдорд╛рд░реЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреЗрд╡рд▓ рдХреЙрд▓рдмреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджрд░рдЕрд╕рд▓, рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╕рдордиреНрд╡рдпрдХ, рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреА рддрд░рд╣, рд╕реНрдореГрддрд┐ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ "рд╕реНрд╡рдпрдВ" рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдХреБрдЫ рд╕рдордиреНрд╡рдпрдХ рджреВрд╕рд░реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рд░рдЦрддреЗ рд╣реИрдВред рдЬрдм рдореВрд▓ рд╕рдордиреНрд╡рдпрдХ рдХреА "рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░", рдореВрд▓ рд╕рдордиреНрд╡рдпрдХ рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╡рд░реНрддрдХ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реВрд╢ рдХреА рдЕрдкрдиреА рджреГрд╖реНрдЯрд┐ рд╣реИ , рдФрд░ рдХреБрдЫ рдпреЛрдЧреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рднреА рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗред

рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛


рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрджреНрдпрдкрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ рдЬреЛ рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдП рдереЗ, рдХреЛрдб рд╕реЗ рдЕрдВрд╢ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕рд░рд▓ рдФрд░ рдХрдо рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЬрдм рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЯреАрдо рдореЗрдВ рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдирд╣реАрдВ рдереА: рдореМрдЬреВрджрд╛ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдкреБрдирд░реНрдорд┐рд▓рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп "рд░рд╛рдЙрдЯрд░" рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛, рдЬреЛ рдХрд┐ UINavigationController рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдФрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реИред рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ UIViewController рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ - рд░реВрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рдкреБрд╢ / рдкреЙрдк, рд╡рд░реНрддрдорд╛рди / рдмрд░реНрдЦрд╛рд╕реНрддрдЧреА рдФрд░ рдЬреЛрдбрд╝рддреЛрдбрд╝ред рдРрд╕реЗ рд░рд╛рдЙрдЯрд░ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 import UIKit protocol Router { func present(_ module: UIViewController, animated: Bool) func dismissModule(animated: Bool, completion: (() -> Void)?) func push(_ module: UIViewController, animated: Bool, completion: (() -> Void)?) func popModule(animated: Bool) func setAsRoot(_ module: UIViewController) func popToRootModule(animated: Bool) } 

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди UINavigationController рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рд╕реАрдорд╛: рдЖрдк UINavigationController рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП: UINavigationController рдЕрдкрдиреЗ рд╕реНрдЯреИрдХ рдореЗрдВ UINavigationController рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдПрдХ UIKit рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ)ред

рд╕рдордиреНрд╡рдпрдХ, рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреА рддрд░рд╣, рдПрдХ рдорд╛рд▓рд┐рдХ рдХреА рдЬрд░реВрд░рдд рд╣реИ - рдПрдХ рдЕрдиреНрдп рд╡рд╕реНрддреБ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧреАред рд░реВрдЯ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдпрдХ рдЕрдиреНрдп рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХреЛ рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рдордиреНрд╡рд┐рдд рдЬрдирд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдмрдВрдзрди рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛:

 class Coordinator { private var childCoordinators = [Coordinator]() func add(dependency coordinator: Coordinator) { // ... } func remove(dependency coordinator: Coordinator) { // ... } } 

рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХреЗ рдирд┐рд╣рд┐рдд рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ UIViewController рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХрд╛ UIViewController -рдкреНрд░рджрд╛рди рд╣реИред рд░рд╛рдЙрдЯрд░ рдФрд░ рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд┐рдпрд╛:

 protocol Presentable { func presented() -> UIViewController } 

рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордиреНрд╡рдпрдХ рдХреЛ Coordinator рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ Presentable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд░рд╛рдЙрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

 protocol Router { func present(_ module: Presentable, animated: Bool) func dismissModule(animated: Bool, completion: (() -> Void)?) func push(_ module: Presentable, animated: Bool, completion: (() -> Void)?) func popModule(animated: Bool) func setAsRoot(_ module: Presentable) func popToRootModule(animated: Bool) } 

( Presentable рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдпреЛрдЬрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ UIViewController рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ (рдореЙрдбреНрдпреВрд▓) рдХреЛ рдХрдЯреНрдЯрд░рдкрдВрдереА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдзреАрди рдХрд┐рдП рдмрд┐рдирд╛ред

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЗрд╕ рд╕рдм рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг:

 final class FirstCoordinator: Coordinator, Presentable { func presented() -> UIViewController { return UIViewController() } } final class SecondCoordinator: Coordinator, Presentable { func presented() -> UIViewController { return UIViewController() } } let nc = UINavigationController() let router = RouterImpl(navigationController: nc) // Router implementation. router.setAsRoot(FirstCoordinator()) router.push(SecondCoordinator(), animated: true, completion: nil) router.popToRootModule(animated: true) 

рдЕрдЧрд▓рд╛ рд╕рдиреНрдирд┐рдХрдЯрди


рдФрд░ рдлрд┐рд░ рдПрдХ рджрд┐рди рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкреВрд░реНрдг рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдг рдЖрдпрд╛! рд╡рд╣ рдХреНрд╖рдг рдЬрдм рдХреБрдЫ рднреА рд╣рдореЗрдВ рд╕рдордиреНрд╡рд┐рдд start() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдордиреНрд╡рдпрдХреЛрдВ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рдерд╛ - рдПрдХ рдРрд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рд╕рд╛рджрдЧреА рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд╕рд╛рде рдореЛрд╣рд┐рдд рд╣реЛ рдЧрдпрд╛ред

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд Coordinator рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 protocol Coordinator { func add(dependency coordinator: Coordinator) func remove(dependency coordinator: Coordinator) func start() } class BaseCoordinator: Coordinator { private var childCoordinators = [Coordinator]() func add(dependency coordinator: Coordinator) { // ... } func remove(dependency coordinator: Coordinator) { // ... } func start() { } } 

"рд╕реНрд╡рд┐рдлреНрдЯ" рдЕрдореВрд░реНрдд рд╡рд░реНрдЧреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рд╢рд╛рд╕реНрддреНрд░реАрдп, рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рдЙрдиреНрдореБрдЦ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдиреНрдореБрдЦ рд╣реИ , рдЗрд╕рд▓рд┐рдП start() рд╡рд┐рдзрд┐ рдПрдХ рдЦрд╛рд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╛ рдЬреЛрд░ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ fatalError(_:file:line:) (рд╡рд╛рд░рд┐рд╕ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ fatalError(_:file:line:) рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

рд▓реЗрдХрд┐рди рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЕрд╡рд╕рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛:

 extension Coordinator { func add(dependency coordinator: Coordinator) { // ... } func remove(dependency coordinator: Coordinator) { // ... } } 

рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝реАрд▓реНрдб рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрди рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдирд┐рдЬреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдордиреНрд╡рдпрдХ рдХрд╛ рдЖрдзрд╛рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 final class SomeCoordinator: BaseCoordinator { override func start() { // ... } } 

рд╕рдордиреНрд╡рдпрдХ рдХреЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЛрдИ рднреА рдирд┐рд░реНрднрд░рддрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, UINavigationController рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдпрджрд┐ рдпрд╣ рд░реВрдЯ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯрд░ рд╣реИ рдЬрд┐рд╕рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд░реВрдЯ UIViewController рдХреЛ рдореИрдк рдХрд░рдирд╛ рд╣реИ, рддреЛ рд╕рдордиреНрд╡рдпрдХ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЦрд╛рд▓реА рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде UINavigationController рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЬрдм рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдШрдЯрдирд╛рдУрдВ (рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЕрдзрд┐рдХ), рд╕рдордиреНрд╡рдпрдХ рдЗрд╕ UINavigationController рдЖрдЧреЗ рдЕрдиреНрдп рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХрд┐ рдпрд╣ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдкрд░ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╡реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд╣рд┐рдП: "рдкреБрд╢", "рд╡рд░реНрддрдорд╛рди", рдФрд░ рдХрдо рд╕реЗ рдХрдо рдкреВрд░реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реНрдЯреИрдХ рдХреЛ рдмрджрд▓реЗрдВред

рд╕рдВрднрд╡ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░


рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдпрдХ рдЕрдиреНрдп рд╕рдордиреНрд╡рдпрдХреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрди рд╕рднреА рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд рдЯреАрдо рдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рд╡рд┐рд░рд╛рд╕рдд рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдФрд░ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдмрдВрдзрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛:

 protocol CoordinatorDependencies { func add(dependency coordinator: Coordinator) func remove(dependency coordinator: Coordinator) } final class DefaultCoordinatorDependencies: CoordinatorDependencies { private let dependencies = [Coordinator]() func add(dependency coordinator: Coordinator) { // ... } func remove(dependency coordinator: Coordinator) { // ... } } final class SomeCoordinator: Coordinator { private let dependencies: CoordinatorDependencies init(dependenciesManager: CoordinatorDependencies = DefaultCoordinatorDependencies()) { dependencies = dependenciesManager } func start() { // ... } } 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЬрдирд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛


рдареАрдХ рд╣реИ, рд╕рдордиреНрд╡рдпрдХ рдиреЗ рдмрдирд╛рдпрд╛ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдПрдХ рдирдИ рдореИрдкрд┐рдВрдЧ рд╢реБрд░реВ рдХреАред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░реАрди рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рджреГрд╢реНрдп рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рджреЗрдЦрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд╣ рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдмрдЯрди, рдкрд╛рда рдХреНрд╖реЗрддреНрд░, рдЖрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдордиреНрд╡рдпрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ UIViewController рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рд╣реИ:

 final class SomeViewController: UIViewController { } 

рдФрд░ рд╕рдордиреНрд╡рдпрдХ рдЬреЛ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

 final class SomeCoordinator: Coordinator { private let dependencies: CoordinatorDependencies private weak var navigationController: UINavigationController? init(navigationController: UINavigationController, dependenciesManager: CoordinatorDependencies = DefaultCoordinatorDependencies()) { self.navigationController = navigationController dependencies = dependenciesManager } func start() { let vc = SomeViewController() navigationController?.pushViewController(vc, animated: true) } } 

рд╣рдо рдПрдХ рд╣реА рд╕рдордиреНрд╡рдпрдХ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реМрдВрдкрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╢рд╛рд╕реНрддреНрд░реАрдп рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 protocol SomeViewControllerRoute: class { func onSomeEvent() } final class SomeViewController: UIViewController { private weak var route: SomeViewControllerRoute? init(route: SomeViewControllerRoute) { self.route = route super.init(nibName: nil, bundle: nil) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } @IBAction private func buttonAction() { route?.onSomeEvent() } } final class SomeCoordinator: Coordinator { private let dependencies: CoordinatorDependencies private weak var navigationController: UINavigationController? init(navigationController: UINavigationController, dependenciesManager: CoordinatorDependencies = DefaultCoordinatorDependencies()) { self.navigationController = navigationController dependencies = dependenciesManager } func start() { let vc = SomeViewController(route: self) navigationController?.pushViewController(vc, animated: true) } } extension SomeCoordinator: SomeViewControllerRoute { func onSomeEvent() { // ... } } 

рд░рд┐рдЯрд░реНрди рдмрдЯрди рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛


рдкреЙрд▓ рд╣рдбрд╕рди рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ "рд╣реИрдХрд┐рдВрдЧ рд╡рд┐рдж рд╕реНрд╡рд┐рдлреНрдЯ" рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╕рдореАрдХреНрд╖рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдИ рдереА, рдПрдХ рдЧрд╛рдЗрдб рднреА рдХрд╣ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рд░рд┐рдЯрд░реНрди рдмрдЯрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЙрдирдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓, рд╕реАрдзрд╛, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ: рд╕рдордиреНрд╡рдпрдХ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рдЦреБрдж рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд UINavigationController рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рдШрдЯрдирд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЦрд╛рдореА рд╣реИ: рдХреЗрд╡рд▓ NSObject рдПрдХ UINavigationController рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ, рдПрдХ рд╕рдордиреНрд╡рдпрдХ рд╣реИ рдЬреЛ рджреВрд╕рд░реЗ рд╕рдордиреНрд╡рдпрдХ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреНрдп, рдХреЙрд▓рд┐рдВрдЧ start() UIVIVController рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЛ UINavigationController рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред UINavigationBar рдкрд░ рдмреИрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ UINavigationBar рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореВрд▓ рд╕рдордиреНрд╡рдпрдХ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рджреЗрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рд╕рдордиреНрд╡рдпрдХ рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо ("рдкреНрд░рд╡рд╛рд╣") рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЙрдкрдХрд░рдг рдкреЗрд╢ рдХрд┐рдпрд╛: рдкреНрд░рддреНрдпреЗрдХ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд╕рдордиреНрд╡рдпрдХ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬрдирд░реЗрдЯрд┐рдВрдЧ рд╕рдордиреНрд╡рдпрдХ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 protocol CoordinatorFlowListener: class { func onFlowFinished(coordinator: Coordinator) } final class MainCoordinator: NSObject, Coordinator { private let dependencies: CoordinatorDependencies private let navigationController: UINavigationController init(navigationController: UINavigationController, dependenciesManager: CoordinatorDependencies = DefaultCoordinatorDependencies()) { self.navigationController = navigationController dependencies = dependenciesManager super.init() } func start() { let someCoordinator = SomeCoordinator(navigationController: navigationController, flowListener: self) dependencies.add(someCoordinator) someCoordinator.start() } } extension MainCoordinator: CoordinatorFlowListener { func onFlowFinished(coordinator: Coordinator) { dependencies.remove(coordinator) // ... } } final class SomeCoordinator: NSObject, Coordinator { private weak var flowListener: CoordinatorFlowListener? private weak var navigationController: UINavigationController? init(navigationController: UINavigationController, flowListener: CoordinatorFlowListener) { self.navigationController = navigationController self.flowListener = flowListener } func start() { // ... } } extension SomeCoordinator: UINavigationControllerDelegate { func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { guard let fromVC = navigationController.transitionCoordinator?.viewController(forKey: .from) else { return } if navigationController.viewControllers.contains(fromVC) { return } if fromVC is SomeViewController { flowListener?.onFlowFinished(coordinator: self) } } } 

рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, MainCoordinator рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдмрд╕ рдПрдХ рдФрд░ рд╕рдордиреНрд╡рдпрдХ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, MainCoordinator рдмрд╛рд╣рд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдХрд┐рд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реИ - рдЕрдзрд┐рдХреГрдд, рдЕрдзрд┐рдХреГрдд рдирд╣реАрдВ, рдЖрджрд┐ред - рдФрд░ рдХрд┐рд╕ рд╕реНрдХреНрд░реАрди рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдордиреНрд╡рдпрдХ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдореВрд▓ рд╕рдордиреНрд╡рдпрдХ рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдореБрдЦреНрдп рд╕рдордиреНрд╡рдпрдХ рдХреЛ CoordinatorFlowListener рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ CoordinatorFlowListener рдФрд░ рдПрдХ рдЕрдиреНрдп рд╕рдордиреНрд╡рдпрдХ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╢реБрднрд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрджреА рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди)ред

рд╣рд╛рдВ, рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдПрдХ рд╣реА рджрд┐рд╢рд╛ рд╣реИ: рдЙрддреНрдкрдиреНрди рд╕реЗ рдЙрддреНрдкрдиреНрди (рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╕рдордиреНрд╡рдпрдХ рддрдХ, рдЙрддреНрдкрдиреНрди рд╕рдордиреНрд╡рдпрдХ рд╕реЗ рдЙрддреНрдкрдиреНрди рддрдХ)ред

рд╣рд╛рдВ, рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдпрдХ рдХреЛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ UINavigationController рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред (рдкрд╣рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдпрд╣ рдЦрд╛рдореА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдзрд┐рдХ рдЙрджрд╛рд░рддрд╛ рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордиреНрд╡рдпрдХ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдЬреНрдЮрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИред)

рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рд╕рдордиреНрд╡рдпрдХ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдкрдиреЗ рдЖрд╕рдкрд╛рд╕ рдХреА рджреБрдирд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЙрд╕рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рддрд░реНрдХ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдмрд╛рд╣рд░реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдордиреНрд╡рдпрдХ рдХреЛ рд╕реАрдзреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ, рддрдм рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм start() рд╡рд┐рдзрд┐ рдХреЛ onFlowFinished(coordinator:) рдпрд╛ onFlowFinished(coordinator:) рдХреЙрд▓рдмреИрдХ onFlowFinished(coordinator:) ред рдФрд░ рдЗрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ "рд╣рд╛рд░реНрдбрдХреЛрдб" рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛: рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝рдирд╛, рд╕реНрдЯреИрдХ рдХреЛ рдмрджрд▓рдирд╛, рд░реВрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд▓реМрдЯрдирд╛ - рдЬреЛ рднреА рд╣реЛред рдФрд░ рдпрд╣ рд╕рдм рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдВрддреНрд░рдХ рдХреА рджрдХреНрд╖рддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдмрд╛рд╣рд░реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдХреЛрдб "рд╕реБрдВрджрд░" рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдкреНрд░рддреАрдд рд╣реБрдЖ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдХрдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдЧрд░реВрдХ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕рдВрднрд╡ рд╣реИред
рдЗрд╕ рдЬрдЧрд╣ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕реАрдЦрд╛ред рдФрд░ рдЕрдЧрд░ рдЖрдк рдЕрдЪрд╛рдирдХ "рдореБрдЭрд╕реЗ рдЕрдзрд┐рдХ" рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдореЗрд░реЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ ред

Source: https://habr.com/ru/post/hi444038/


All Articles