рд░реВрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ iOS- рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд╛ рд╕рдВрдЧрдарди



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

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

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

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рджреЛрдиреЛрдВ рдкреНрд░рд╕реНрддреБрддрд┐ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ (рд╡рд░реНрддрдорд╛рди) рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдирд┐рдпрдВрддреНрд░рдХреЛрдВ (рдзрдХреНрдХрд╛) рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реНрдЯреИрдХ, рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрд╛рд░рдг рдкрд┐рдЫрд▓реЗ рд╕рднреА ViewControllers рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВред
  2. Window.rootViewController рдЯреЙрдЧрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдкрд┐рдЫрд▓реЗ рд╕рднреА ViewControllers рд╕реНрдореГрддрд┐ рдореЗрдВ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ UI рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

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

рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ:

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

рдЖрд╡реЗрджрди рдХреЗ рдЗрди рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реНрдЯреИрдХ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:

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


рдореВрд▓ рд╕реЗрдЯрд┐рдВрдЧ

рдЬрдм рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд░реВрдЯрд╡реНрдпреВрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХреЛрдб рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд┐рд▓реНрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЛрдиреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред XCode рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣реЛ рдЬрд╛рдПрдЧрд╛: main.storyboard рдкрд╣рд▓реЗ рд╕реЗ рд╣реА window.rootViewController рд╕реЗ рдмрдВрдзрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХреЗ рдореБрдЦреНрдп рд╡рд┐рд╖рдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, main.storyboard рдХреЛ рд╣рдЯрд╛рдПрдВ, рдФрд░ рд▓рдХреНрд╖реНрдп -> тАЛтАЛрд╕рд╛рдорд╛рдиреНрдп -> тАЛтАЛрдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрдВрддрд░реНрдЧрдд "рдореБрдЦреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдлрд╝реАрд▓реНрдб рдХреЛ рднреА рд╕рд╛рдлрд╝ рдХрд░реЗрдВ:



рдЕрдм AppDelegate рдореЗрдВ didFinishLaunchingWithOptions рд╡рд┐рдзрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗ :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = RootViewController() window?.makeKeyAndVisible() return true } 

рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ RootViewController рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ред рдореВрд▓ ViewController рдХреЛ RootViewController рдХрд╛ рдирд╛рдо рджреЗрдВ :

 class RootViewController: UIViewController { } 

рдпрд╣ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕рднреА рд╕рдВрдХреНрд░рдордгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдореБрдЦреНрдп рдирд┐рдпрдВрддреНрд░рдХ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рд╕рдВрдХреНрд░рдордг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AppDelegate рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝реЗрдВ:

 extension AppDelegate { static var shared: AppDelegate { return UIApplication.shared.delegate as! AppDelegate } var rootViewController: RootViewController { return window!.rootViewController as! RootViewController } } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреА рдордЬрдмреВрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдЙрдЪрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░реВрдЯрд╡реНрдпреВрдХрдВрдЯреНрд░реЛрд▓рд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрд╡реЗрджрди рджреБрд░реНрдШрдЯрдирд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рд╣реИред

рддреЛ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ RootViewController рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ:

 let rootViewController = AppDelegate.shared.rootViewController 

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

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

 class SplashViewController: UIViewController { private let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.white view.addSubview(activityIndicator) activityIndicator.frame = view.bounds activityIndicator.backgroundColor = UIColor(white: 0, alpha: 0.4) makeServiceCall() } private func makeServiceCall() { } } 

рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DispatchQueue.main.asyncAfter рд╡рд┐рдзрд┐ рдХреЛ 3 рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рд╕реЗ рдЬреЛрдбрд╝реЗрдВ:

 private func makeServiceCall() { activityIndicator.startAnimating() DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(3)) { self.activityIndicator.stopAnimating() } } 

рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП UserDefaults рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 private func makeServiceCall() { activityIndicator.startAnimating() DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(3)) { self.activityIndicator.stopAnimating() if UserDefaults.standard.bool(forKey: тАЬLOGGED_INтАЭ) { // navigate to protected page } else { // navigate to login screen } } } 

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

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

 class LoginViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.white title = "Login Screen" let loginButton = UIBarButtonItem(title: "Log In", style: .plain, target: self, action: #selector(login)) navigationItem.setLeftBarButton(loginButton, animated: true) } @objc private func login() { // store the user session (example only, not for the production) UserDefaults.standard.set(true, forKey: "LOGGED_IN") // navigate to the Main Screen } } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, MainViewController рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдВ:

 class MainViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.lightGray // to visually distinguish the protected part title = тАЬMain ScreenтАЭ let logoutButton = UIBarButtonItem(title: тАЬLog OutтАЭ, style: .plain, target: self, action: #selector(logout)) navigationItem.setLeftBarButton(logoutButton, animated: true) } @objc private func logout() { // clear the user session (example only, not for the production) UserDefaults.standard.set(false, forKey: тАЬLOGGED_INтАЭ) // navigate to the Main Screen } } 

рд░реВрдЯ рдиреЗрд╡рд┐рдЧреЗрд╢рди

рдЕрдм рд╡рд╛рдкрд╕ RootViewController рдкрд░ рдЬрд╛рдПрдВ ред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛, рд░реВрдЯрд╡реНрдпреВрдХрдВрдЯреНрд░реЛрд▓рд░ рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рдпрдВрддреНрд░рдХ рдвреЗрд░ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЖрд╡реЗрджрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрд╡рдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЪрд░ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд░реНрддрдорд╛рди ViewController рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ:

 class RootViewController: UIViewController { private var current: UIViewController } 

рдХреНрд▓рд╛рд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдкрд╣рд▓рд╛ ViewController рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ SplashViewController рд╣реЛрдЧрд╛:

 class RootViewController: UIViewController { private var current: UIViewController init() { self.current = SplashViewController() super.init(nibName: nil, bundle: nil) } } 

ViewDidLoad рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдпрдХрд╛рд░рдХ рдХреЛ RootViewController рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ :

 class RootViewController: UIViewController { ... override func viewDidLoad() { super.viewDidLoad() addChildViewController(current) // 1 current.view.frame = view.bounds // 2 view.addSubview(current.view) // 3 current.didMove(toParentViewController: self) // 4 } } 

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЪрд╛рдЗрд▓реНрдб рд╡реНрдпреВ рдХреЙрдиреНрдЯреНрд░реЛрд▓рд░ (1) рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо current.view.frame рдХреЛ view.bounds (2) рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рд╣рдо рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рджреГрд╢реНрдпрдХрд╛рд░реНрдЯреНрд░реЛрд▓рд░ рдХреЛ рдЕрднреА рднреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝реНрд░реЗрдо рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдПрдХ рдирдпрд╛ рд╕рдмрд╡реНрдпреВ (3) рдЬреЛрдбрд╝реЗрдВ рдФрд░ didMove (toParentViewController :) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рдРрдб рдХрдВрдЯреНрд░реЛрд▓рд░ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред рдЬреИрд╕реЗ рд╣реА RootViewController рдмреВрдЯ рд╣реЛрддрд╛ рд╣реИ , рдЙрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж SplashViewController рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЕрдм рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рдПрдиреАрдореЗрд╢рди рдХреЗ LoginViewController рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ, MainViewController рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪрд┐рдХрдиреА рдбрд┐рдорд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдкрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рдВрдХреНрд░рдордг рдХрд╛ рд╕реНрд▓рд╛рдЗрдб рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛ред

 class RootViewController: UIViewController { ... func showLoginScreen() { let new = UINavigationController(rootViewController: LoginViewController()) // 1 addChildViewController(new) // 2 new.view.frame = view.bounds // 3 view.addSubview(new.view) // 4 new.didMove(toParentViewController: self) // 5 current.willMove(toParentViewController: nil) // 6 current.view.removeFromSuperview()] // 7 current.removeFromParentViewController() // 8 current = new // 9 } 

LoginViewController (1) рдмрдирд╛рдПрдВ, рдЪрд╛рдЗрд▓реНрдб рдХрдВрдЯреНрд░реЛрд▓рд░ (2), рд╕реЗрдЯ рдлреНрд░реЗрдо (3) рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рд╕рдмрд╡реНрдпреВ (4) рдХреЗ рд░реВрдк рдореЗрдВ LoginController рдХреЗ рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВ рдФрд░ didMove (5) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдЕрдЧрд▓рд╛, рд╡рд┐рд▓реЛрд╡ (6) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдВрддреНрд░рдХ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ, рдкрд░реНрдпрд╡реЗрдХреНрд╖рдг (7) рд╕реЗ рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдп рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рд░реВрдЯрд╡реНрдпреВрдХрдВрдЯреНрд░реЛрд▓рд░ (8) рд╕реЗ рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдВрддреНрд░рдХ (9) рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред

рдЕрдм рд╣рдо switchToMainScreen рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ:

 func switchToMainScreen() { let mainViewController = MainViewController() let mainScreen = UINavigationController(rootViewController: mainViewController) ... } 

рд╕рдВрдХреНрд░рдордг рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

 private func animateFadeTransition(to new: UIViewController, completion: (() -> Void)? = nil) { current.willMove(toParentViewController: nil) addChildViewController(new) transition(from: current, to: new, duration: 0.3, options: [.transitionCrossDissolve, .curveEaseOut], animations: { }) { completed in self.current.removeFromParentViewController() new.didMove(toParentViewController: self) self.current = new completion?() //1 } } 

рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╣рдж рддрдХ ShowLoginScreen рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдПрдиреАрдореЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рднреА рдЕрдВрддрд┐рдо рдЪрд░рдг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд░рдордг рдХреЗ рдЕрдВрдд рдХреА рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рд╣рдо рдХреНрд▓реЛрдЬрд░ (1) рдХрд╣рддреЗ рд╣реИрдВред

рдЕрдм switchToMainScreen рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 func switchToMainScreen() { let mainViewController = MainViewController() let mainScreen = UINavigationController(rootViewController: mainViewController) animateFadeTransition(to: mainScreen) } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЪрд▓рд┐рдП рдЖрдЦрд┐рд░реА рддрд░реАрдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ MainViewController рд╕реЗ LoginViewController рдХреЗ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛:

 func switchToLogout() { let loginViewController = LoginViewController() let logoutScreen = UINavigationController(rootViewController: loginViewController) animateDismissTransition(to: logoutScreen) } 

AnimateDismissTransition рд╡рд┐рдзрд┐ рд╕реНрд▓рд╛рдЗрдб рдПрдиреАрдореЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

 private func animateDismissTransition(to new: UIViewController, completion: (() -> Void)? = nil) { new.view.frame = CGRect(x: -view.bounds.width, y: 0, width: view.bounds.width, height: view.bounds.height) current.willMove(toParentViewController: nil) addChildViewController(new) transition(from: current, to: new, duration: 0.3, options: [], animations: { new.view.frame = self.view.bounds }) { completed in self.current.removeFromParentViewController() new.didMove(toParentViewController: self) self.current = new completion?() } } 

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

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, SplashViewController, LoginViewController рдФрд░ MainViewController рд╕реЗ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ:

 class SplashViewController: UIViewController { ... private func makeServiceCall() { if UserDefaults.standard.bool(forKey: тАЬLOGGED_INтАЭ) { // navigate to protected page AppDelegate.shared.rootViewController.switchToMainScreen() } else { // navigate to login screen AppDelegate.shared.rootViewController.switchToLogout() } } } class LoginViewController: UIViewController { ... @objc private func login() { ... AppDelegate.shared.rootViewController.switchToMainScreen() } } class MainViewController: UIViewController { ... @objc private func logout() { ... AppDelegate.shared.rootViewController.switchToLogout() } } 

рд╕рдВрдХрд▓рди рдХрд░реЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдВ рдФрд░ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

- рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдХреНрд░рд┐рдп рдЪрд╛рд▓реВ рд╕рддреНрд░ рд╣реЛ (рд▓реЙрдЧ рдЗрди)
- рдЬрдм рдХреЛрдИ рд╕рдХреНрд░рд┐рдп рд╕рддреНрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрдкреНрд▓реИрд╢рд╕реНрдХреНрд░реАрди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕рдВрдХреНрд░рдордг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред



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

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


All Articles