{"id":333959,"date":"2022-06-02T09:00:49","date_gmt":"2022-06-02T09:00:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=333959"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=333959","title":{"rendered":"<span>\u0413\u0438\u0431\u043a\u0430\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0432 iOS<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443? \u0412\u043e\u0442 \u0438 \u044f \u043d\u0435 \u043f\u043e\u043c\u043d\u044e. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2013 \u044d\u0442\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0434\u043e\u0431\u0440\u0430\u044f \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u2013 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0417\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\u00a0\u00a0<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0422\u0438\u043c\u0443\u0440 \u0428\u0430\u0444\u0438\u0433\u0443\u043b\u0438\u043d, \u044f \u2013 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 <a href=\"http:\/\/hh.ru\">hh.ru<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/af2\/5b0\/e46\/af25b0e4684cb25e522083c9d104879b.jpg\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/af2\/5b0\/e46\/af25b0e4684cb25e522083c9d104879b.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Nivelir<\/h2>\n<p>\u0412 <a href=\"https:\/\/www.google.com\/url?q=https:\/\/habr.com\/ru\/company\/hh\/blog\/659523\/&amp;sa=D&amp;source=docs&amp;ust=1654080039343323&amp;usg=AOvVaw3wKLjP0Iwb6JeUqac0RqLD\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0431\u0437\u043e\u0440 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u2013 \u044d\u0442\u043e Badoo \u0438 RouteComposer. \u041e\u043d\u0438 \u043e\u0431\u0430 \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043d\u0430\u0448\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0438 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 \u0435\u0433\u043e Nivelir. <\/p>\n<p><strong>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0438 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>ScreenNavigator<\/strong> \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0441 \u0432\u0430\u0448\u0438\u043c <code>UIWindow<\/code>, \u0438\u0449\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><strong>ScreenAction<\/strong> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438: \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0432 \u0441\u0442\u0435\u043a etc.;<\/p>\n<\/li>\n<li>\n<p><strong>Screen<\/strong> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d \u0438 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432 \u043d\u0435\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u2013 <a href=\"https:\/\/github.com\/hhru\/Nivelir\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<h2>\u041a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u2013 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u044b. <strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u0432 \u044d\u0442\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u2013 <u>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f<\/u>. \u0421\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0441 Nivelir \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. <\/p>\n<pre><code class=\"swift\">private func showChat(id: Int) {     screenNavigator.navigate(from: stack) { route in         route.push(             ChatScreen(                 roomID: roomID,                 chatID: id             )         )     } }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0438\u043c ScreenNavigator \u0441\u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0441 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f UINavigationController), \u0437\u0430\u0442\u0435\u043c \u043f\u0438\u0448\u0435\u043c <code>route.push(_:)<\/code> \u0438 \u043a\u043b\u0430\u0434\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0432 \u0441\u0442\u0435\u043a \u2013 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0422\u0430\u043a\u0436\u0435 Nivelir \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442 \u0441 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c\u0438 \u0438\u0437 UIKit: UIAlertController, UIDocumentInteractionController, UIImagePickerController \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438. <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c ActionSheet (UIAlertController \u0441 \u0442\u0438\u043f\u043e\u043c .actionSheet \u0438\u0437 UIKit) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Nivelir. <\/p>\n<pre><code class=\"swift\">private func pickPhotoImage(sender: UIView) {     let actionSheet = ActionSheet(         anchor: .center(of: sender),         actions: [             ActionSheetAction(title: \"Take Photo\") {                 self.pickPhotoImageFromCamera()             },             ActionSheetAction(title: \"Choose Photo\") {                 self.pickPhotoImageFromPhotoLibrary()             },             .cancel(title: \"Cancel\")         ]     )      screenNavigator.navigate(from: self) { route in         route.showActionSheet(actionSheet)     } }<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e ActionSheet \u0438 Alert \u0432 Nivelir \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c anchor. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f iPad, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u0442\u0435 UIAlertController \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c UIKit \u0442\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043a\u0440\u0430\u0448 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 actions \u2013 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c: \u043a\u0430\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c ActionSheet. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e\u0442 ActionSheet, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f ScreenAction \u0447\u0435\u0440\u0435\u0437 Route \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>showActionSheet(_:)<\/code>, \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. <\/p>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f. \u041e\u043d\u0438 \u0432 Nivelir \u0431\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u0433\u0434\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 UIWindow) \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0437\u0434\u0435\u0441\u044c: &#171;\u043d\u0430\u0439\u0434\u0438 \u0442\u043e\u043f\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043a, \u0437\u0430\u043a\u0440\u043e\u0439 \u043d\u0430 \u043d\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043a\u0440\u0430\u043d \u0438 \u043f\u043e\u043b\u043e\u0436\u0438 \u0432 \u043d\u0435\u0433\u043e \u043d\u043e\u0432\u044b\u0439&#187;. <\/p>\n<pre><code class=\"swift\">func openSupportScreen() {     navigator.navigate { route in         route             .top(.stack)             .dismiss()             .push(screens.supportScreen())     } }<\/code><\/pre>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0449\u0435\u043c UITabBarController, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0430\u0431 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 0 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c UINavigationController. \u0423\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0442\u044d\u043a\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c\u0443 \u044d\u043a\u0440\u0430\u043d\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>popToRoot()<\/code>. <\/p>\n<pre><code class=\"swift\">func showRootVacancyScreen() {     navigator.navigate { route in         route             .first(.tabs)             .selectTab(of: UINavigationController.self, with: .index(0)) { route in                 route.popToRoot()             }     } }<\/code><\/pre>\n<p>\u041d\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u044f\u0436\u0435\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u043e\u0443\u0442\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0432 \u043d\u0438\u0445. <\/p>\n<pre><code class=\"swift\">let presentChatRoute = ScreenModalRoute .initial .present(screens.chatScreen(roomID: 1, chatID: 2))  let pushChatRoute = ScreenStackRoute .initial .push( screens.chatScreen(roomID: 1, chatID: 1),  route: presentChatRoute )<\/code><\/pre>\n<p>\u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u043d\u0430 \u0434\u0432\u0430 \u0440\u043e\u0443\u0442\u0430 \u2013 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e present \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e push. \u042d\u0442\u0438 \u0440\u043e\u0443\u0442\u044b \u043c\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>route<\/strong>.<\/p>\n<pre><code class=\"swift\">navigator.navigate { route in     route         .first(.tabs)         .selectTab(         of: UINavigationController.self,          with: .index(0),          route: pushChatRoute         ) }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0442\u0430\u0431 \u0441 \u0442\u0438\u043f\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 UINavigationController, \u0437\u0430\u043f\u0443\u0448\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0447\u0430\u0442\u0430, \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u0437\u0430\u043f\u0443\u0448\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u044d\u043a\u0440\u0430\u043d \u0447\u0430\u0442\u0430.<\/p>\n<p>\u0421\u0430\u043c\u0438 \u0440\u043e\u0443\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0442\u0438\u043f\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. <\/p>\n<pre><code class=\"swift\">public typealias ScreenModalRoute = ScreenRootRoute&lt;UIViewController> public typealias ScreenStackRoute = ScreenRootRoute&lt;UINavigationController> public typealias ScreenTabsRoute = ScreenRootRoute&lt;UITabBarController> public typealias ScreenWindowRoute = ScreenRootRoute&lt;UIWindow><\/code><\/pre>\n<p>ScreenModalRoute \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0434\u043b\u044f UIVievController. \u0410 ScreenStakRoute \u0443\u0436\u0435 \u0441\u043c\u043e\u0436\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0442\u044c push, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0438\u043f\u043e\u043c \u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f UINavigationController. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438 ScreenTabsRoute \u0438 ScreenWindowRoute.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0435\u0440\u0442\u0430 Nivelir \u2013 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430. <\/p>\n<pre><code class=\"swift\">private func showChainNavigation() {     screenNavigator.navigate(from: stack) { route in         route             .push(screens.chatScreen(roomID: roomID, chatID: 1))             .pop()             .push(screens.chatScreen(roomID: roomID, chatID: 2))             .push(screens.chatScreen(roomID: roomID, chatID: 3)) { route in                 route.present(screens.chatScreen(roomID: roomID, chatID: 4))             }     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c push \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u0447\u0430\u0442\u043e\u043c \u043d\u043e\u043c\u0435\u0440 \u043e\u0434\u0438\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u0443\u0448\u0430 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439. Nivelir \u0441\u043a\u043b\u0435\u0438\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u0432 \u043e\u0434\u043d\u0443, \u0447\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2013 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/413\/90d\/7eb\/41390d7ebeedeb0a5943af4107fd1251.gif\" width=\"352\" height=\"762\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/413\/90d\/7eb\/41390d7ebeedeb0a5943af4107fd1251.gif\"\/><figcaption><\/figcaption><\/figure>\n<p><strong>\u0422\u0440\u0435\u0442\u0438\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u043f\u043e\u0438\u0441\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c route, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<pre><code class=\"swift\">func showChatRoute(roomID: Int, chatID: Int) -> ScreenWindowRoute {     let screen = chatScreen(roomID: roomID, chatID: chatID)      return ScreenWindowRoute()         .last(.container(key: screen.key))         .makeVisible()         .refresh()         .resolve() }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c screen. \u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c UIViewController, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u2013 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Screen \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439 \u0434\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c route \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0430. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c ScreenWindowRoute, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c UIWindow. \u041c\u0435\u0442\u043e\u0434 <code>last(_:)<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e UITabBarController \u0441 \u043a\u043e\u043d\u0446\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0439\u0434\u0435\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u0431. \u0415\u0441\u043b\u0438 \u0432 \u0442\u0430\u0431\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f UINavigationController, \u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u043c \u0441 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0435\u043a\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>makeVisible()<\/code>. \u041e\u043d \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u044d\u043a\u0440\u0430\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u0448\u0438\u043c\u0438 \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u2013 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442 \u0442\u0430\u0431 \u043a \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043a\u0440\u0430\u043d\u0443, \u0430 \u0432 \u0441\u0442\u0435\u043a\u0435 \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u043a \u044d\u043a\u0440\u0430\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>refresh()<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0448 \u0440\u043e\u0443\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0448\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>resolve()<\/code>.<\/p>\n<p><strong>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 DSL. \u041c\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0443 \u0443\u0441\u0438\u043b\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0432 \u043a\u043e\u0434\u0435 \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0412\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c auto-complete \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a UITabBarController \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0443 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0430\u0431. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u043c \u044d\u043a\u0440\u0430\u043d \u0441 \u0447\u0430\u0442\u043e\u043c, \u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0435\u0449\u0435 \u0438 UIAlertController.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ffd\/560\/ccc\/ffd560ccc7308c16302d0e74cd6b99f6.gif\" width=\"1054\" height=\"254\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ffd\/560\/ccc\/ffd560ccc7308c16302d0e74cd6b99f6.gif\"\/><figcaption><\/figcaption><\/figure>\n<p><strong>\u041f\u044f\u0442\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438. \u041c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u0433\u043e\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u0440\u0438\u043c\u0435\u0440: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c ScreenNavigator, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 \u0442\u0438\u043f\u043e\u043c UIVievController. <\/p>\n<pre><code class=\"swift\">private let container: UIViewController?  private func showChainNavigation() {     screenNavigator.navigate(from: container) { route in     \/\/ \u274c Referencing instance method 'push(_:animation:separated:)'          \/\/ on 'ScreenThenable' requires that 'UIViewController'          \/\/ inherit from 'UINavigationController'         route.push(screens.chatScreen(roomID: roomID, chatID: 1))      } }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>push(_:)<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043a\u043e\u043c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>stack<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e UINavigationController. \u041d\u043e, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 nil \u0438\u043b\u0438 \u0441\u0442\u0435\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0442\u043e Nivelir \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0432\u0430\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0430. <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 (\u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u0440\u0438\u043d\u044b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e. <\/p>\n<p><strong>\u0428\u0435\u0441\u0442\u043e\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0412 Nivelir \u043c\u043e\u0436\u043d\u043e \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u043d\u0443 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437 \u2013 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 Nivelir \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u0432\u0430\u043c \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442 \u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441\u043c\u0435\u043d\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b <a href=\"https:\/\/github.com\/hhru\/Nivelir\/blob\/main\/Sources\/Screen\/Actions\/Window\/SetRoot\/Animations\/ScreenRootCustomAnimation.swift\">ScreenRootCustomAnimation<\/a>, \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/hhru\/Nivelir\/blob\/main\/Sources\/Screen\/Actions\/Stack\/SetStack\/Animations\/ScreenStackCustomAnimation.swift\">ScreenStackCustomAnimation<\/a>, \u0434\u043b\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430 <a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiviewcontrollertransitioningdelegate\">UIViewControllerTransitioningDelegate<\/a> \u0438\u0437 UIKit.<\/p>\n<h2>\u041a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438: \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f<\/h2>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u2013 <strong>\u0433\u0440\u0430\u0444 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438<\/strong>. <strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 <\/strong>\u0437\u0434\u0435\u0441\u044c \u2013 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a. \u0412 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u00ab\u043f\u043e\u0438\u0441\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430\u00bb \u043c\u044b \u0443\u0436\u0435 \u0438\u0441\u043a\u0430\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u0441 \u043d\u0443\u0436\u043d\u044b\u043c roomID \u0438 chatID, \u0438, \u0435\u0441\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d, \u043c\u044b \u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e: \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 fallback, \u0438 \u0443\u0436\u0435 \u0432 \u043d\u0435\u043c \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f. <\/p>\n<pre><code class=\"swift\">func showChatRoute(roomID: Int, chatID: Int) -> ScreenWindowRoute {     let screen = chatScreen(roomID: roomID, chatID: chatID)      return ScreenWindowRoute()         .last(.container(key: screen.key))         .makeVisible()         .refresh()         .fallback(             to: showChatListRoute(roomID: roomID)                 .top(.stack)                 .push(screen)         ) }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u044d\u043a\u0440\u0430\u043d \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0447\u0430\u0442\u043e\u0432 \u0438 \u0432 \u043d\u0435\u043c \u0436\u0435 \u0437\u0430\u043f\u0443\u0448\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0441 \u0447\u0430\u0442\u043e\u043c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c MediaPicker \u0438\u0437 Nivelir, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 UIImagePickerController \u0438\u0437 UIKit, \u0442\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 fallback \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 \u043e\u0448\u0438\u0431\u043a\u0438. <\/p>\n<pre><code class=\"swift\">let mediaPicker = MediaPicker(source: .camera) { ... }  screenNavigator.navigate(from: self) { route in     route         .showMediaPicker(mediaPicker)         .fallback { error, route in             switch error {             case is MediaPickerSourceAccessDeniedError:                 return route.showAlert(.cameraPermissionRequired)              case is UnavailableMediaPickerSourceError:                 return route.showAlert(.unavailableMediaSource)                            ...             }         } }<\/code><\/pre>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b. \u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b \u2013 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 Nivelir. \u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u044d\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 <a href=\"https:\/\/github.com\/hhru\/Nivelir\/blob\/main\/Sources\/Screen\/Actions\/ScreenAction.swift\">ScreenAction<\/a>. \u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. <\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 ScreenAutorizeAction, \u043e\u043d \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 ScreenAction. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c DI-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u044d\u043a\u0440\u0430\u043d\u043e\u0432, \u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>perform(container:,navigator:,completion:)<\/code> \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430\u0448\u0443 \u043b\u043e\u0433\u0438\u043a\u0443. <\/p>\n<pre><code class=\"swift\">struct ScreenAuthorizeAction&lt;Container: UIViewController>: ScreenAction {      typealias Output = Container      let services: ScreenAuthorizeActionServices     let screens: ScreenAuthorizeActionScreens      init(...) { ... }      func perform(         container: Container,         navigator: ScreenNavigator,         completion: @escaping Completion     ) {         navigator.logInfo(\"Checking authorization\")          if services.authorizationService().isAuthorized {             completion(.success(container))         } else {             navigator.navigate(                 to: screens.showAuthorizationRoute { isAuthorized in                     if isAuthorized {                         completion(.success(container))                     } else {                         completion(.failure(ScreenCanceledError(for: self)))                     }                 }             )         }     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d, \u0442\u043e \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0435\u043c completion \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e. \u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u044d\u043a\u0440\u0430\u043d \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0438 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043b\u0441\u044f, \u0442\u043e \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e. \u0410 \u0435\u0441\u043b\u0438 \u043e\u043d \u043e\u0442\u043c\u0435\u043d\u0438\u043b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u0440\u043d\u0435\u043c \u0434\u0436\u0435\u043d\u0435\u0440\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 <strong>ScreenCanceledError<\/strong>.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0441\u0435\u043f\u0442\u043e\u0440\u044b \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c extension \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435. <\/p>\n<pre><code class=\"swift\">extension ScreenThenable where Current: UIViewController {     func authorize(         services: ScreenAuthorizeActionServices,         screens: ScreenAuthorizeActionScreens     ) -> Self {         then(             ScreenAuthorizeAction&lt;Current>(                 services: services,                 screens: screens             )         )     } }<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440 \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044f \u043d\u0430\u0448 route, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>authorize(services:,screens:)<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u2013 \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.  <\/p>\n<pre><code class=\"swift\">navigator.navigate(from: self) { route in     route         .authorize(services: services, screens: screens)         .present(screens.chatListScreen(roomID: roomID).withStackContainer()) }<\/code><\/pre>\n<p><strong>\u0422\u0440\u0435\u0442\u0438\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u0438. \u0412 Nivelir \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u0438 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u0435\u0441\u0442\u044c \u0434\u0438\u043f\u043b\u0438\u043d\u043a-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u0438\u0445 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e. <\/p>\n<pre><code class=\"swift\">DeeplinkManager(     deeplinkTypes: [         ChatDeeplink.self     ],     navigator: screenNavigator() )<\/code><\/pre>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u043e\u0432 \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440. \u0421 \u043d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b, \u0430 \u0442\u0438\u043f\u044b \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u043e\u0432 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u043c\u043e\u0433 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0438 \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u0438 \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, \u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412\u0435\u0434\u044c \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0449\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u043e \u2013 \u043e\u043d\u043e \u043d\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, \u0438 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u0434\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 viewDidAppear \u0443 UITabBarController. \u041f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u0438, \u0442\u043e \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. <\/p>\n<pre><code class=\"swift\">override func viewDidAppear(_ animated: Bool) {     super.viewDidAppear(animated)      deeplinkManager.activate(screens: screens) }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u043e\u0439 deeplink. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 deeplink \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u0447\u0430\u0442\u0430, ChatDeelLink \u2013 \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430 \u043d\u0443\u0436\u043d\u044b roomID \u0438 chatID. <\/p>\n<pre><code class=\"swift\">struct ChatDeeplink: Deeplink {      let roomID: Int     let chatID: Int      func navigate(         screens: Screens,         navigator: ScreenNavigator,         handler: DeeplinkHandler     ) throws {         navigator.navigate(             to: screens.showChatRoute(                 roomID: roomID,                 chatID: chatID             )         )     } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Deeplink \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e navigate. \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u0430.<\/p>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u0430 \u2013 ChatDeeplinkPayLoad, \u043e\u0431\u044b\u0447\u043d\u0430\u044f Decodable \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u043f\u043b\u0438\u043d\u043a\u0430. <\/p>\n<pre><code class=\"swift\">struct ChatDeeplinkPayload: Decodable {     enum CodingKeys: String, CodingKey {         case roomID = \"room_id\"         case chatID = \"chat_id\"     }      let roomID: Int     let chatID: Int }<\/code><\/pre>\n<p>\u041d\u043e \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f url, \u043f\u0443\u0448\u0435\u0439 \u0438\u043b\u0438 \u0448\u043e\u0440\u0442\u043a\u0430\u0442\u043e\u0432? \u0412\u0441\u0435 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043d\u0430\u0448 ChatDeeplink \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 url. <\/p>\n<pre><code class=\"swift\">extension ChatDeeplink: URLDeeplink {      static func url(         scheme: String?,         host: String?,         path: [String],         query: ChatDeeplinkPayload?,         context: Any     ) throws -> ChatDeeplink? {         guard let payload = query, scheme == \"nivelir\", host == \"chat\" else {             return nil         }          return Self(roomID: payload.roomID, chatID: payload.chatID)     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 url, \u0438 \u0432 \u043d\u0435\u043c \u043d\u0430\u043c \u0443\u0436\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 url. \u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: query \u0438 context. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448 \u0442\u0438\u043f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Decodable, \u0442\u043e query \u0447\u0430\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0432\u0430\u0448\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, Nivelir \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u0432\u0430\u0441, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u044d\u0442\u043e\u0442 query: \u0434\u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b (\u0441\u0445\u0435\u043c\u0443, \u0445\u043e\u0441\u0442, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0442\u043f), \u043a\u0430\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.\u00a0<\/p>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0441\u0445\u0435\u043c\u0430 \u0438 \u0445\u043e\u0441\u0442, \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0448 ChatDeeplink. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443 \u0434\u0438\u043f\u043b\u0438\u043d\u043a-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043c\u0435\u0442\u043e\u0434 <code>handleURLIfPossible(_:context:)<\/code>, \u0438 \u043e\u0442\u0434\u0430\u0442\u044c \u043d\u0430\u0448 URL. <\/p>\n<pre><code class=\"swift\">func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {     switch userActivity.activityType {     case NSUserActivityTypeBrowsingWeb:         guard let url = userActivity.webpageURL else {             return         }                  services?             .deeplinkManager()             .handleURLIfPossible(url, context: services)      default:         break     } }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 DI-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. Nivelir \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0432\u0430\u0448 \u0434\u0438\u043f\u043b\u0438\u043d\u043a, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0432 \u043f\u043e\u0434 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u2013 <strong>NotificationDeeplink<\/strong> \u0434\u043b\u044f push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u0438 <strong>ShortcutDeeplink <\/strong>\u0434\u043b\u044f shortcuts.<\/p>\n<h2>\u041a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438: \u0442\u0440\u0435\u0442\u044c\u044f \u0441\u0435\u043a\u0446\u0438\u044f<\/h2>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u2013 \u044d\u0442\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c. <strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 <\/strong>\u0432 \u043d\u0435\u0439 \u2013 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Nivelir \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0434\u0443\u043c\u0430\u043b\u0438, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0432 \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0438\u0447\u0435-\u043c\u043e\u0434\u0443\u043b\u0438. \u0418 \u0432\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0448\u0430\u0440\u0438\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c DI-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u043a\u0440\u0438\u043d\u044b. \u041d\u043e \u0441\u043a\u0440\u0438\u043d \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0442\u0435\u0440\u0435\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <strong>eraseToAnyScreen<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0438\u0440\u0430\u0435\u0442 \u0442\u0438\u043f \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443. <\/p>\n<pre><code class=\"swift\">struct Screens {     func homeScreen() -> AnyTabsScreen {         HomeScreen(             services: services,             screens: self         ).eraseToAnyScreen()     }      func roomListScreen() -> AnyModalScreen {         RoomListScreen(             services: services,             screens: self         ).eraseToAnyScreen()     } }<\/code><\/pre>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c AnyModalScreen, AnyStakScreen \u0438 AnyTabsScreen.<\/p>\n<pre><code class=\"swift\">public typealias AnyModalScreen = AnyScreen&lt;UIViewController> public typealias AnyStackScreen = AnyScreen&lt;UINavigationController> public typealias AnyTabsScreen = AnyScreen&lt;UITabBarController><\/code><\/pre>\n<p>\u0412\u0441\u0435 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0442\u0438\u043f\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0441\u043a\u0440\u0438\u043d\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f AnyStakScreen \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c push, \u0430 \u0434\u043b\u044f AnyTabsScreen \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c tab. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u044b \u0432 DI-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0440\u0430\u043d\u044b, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u0447\u0435-\u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438. <\/p>\n<pre><code class=\"swift\">struct Screen {      func showHomeRoute() -> ScreenWindowRoute {         ScreenWindowRoute()             .setRoot(to: homeScreen(), animation: .crossDissolve)             .makeKeyAndVisible()     }      func showRoomListRoute() -> ScreenWindowRoute {         ScreenWindowRoute()             .last(.container(key: roomListScreen().key))             .makeVisible()             .fallback(to: showHomeRoute())     } }<\/code><\/pre>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 <\/strong>\u2013 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Nivelir \u0432\u0430\u0448\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 Screen. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043e\u0442 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043a \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c\u0443 \u2013 \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 Nivelir.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 <\/h2>\n<p>\u0421 Nivelir \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 Nivelir \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 tvOS, \u043a\u0430\u043a \u0431\u043e\u043d\u0443\u0441.<\/p>\n<p>\u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c <a href=\"https:\/\/github.com\/hhru\/Nivelir\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. \u0422\u0430\u043c \u0436\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Nivelir. \u041f\u0438\u0448\u0438\u0442\u0435 \u043b\u044e\u0431\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b, \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/hh\/blog\/669124\/\"> https:\/\/habr.com\/ru\/company\/hh\/blog\/669124\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443? \u0412\u043e\u0442 \u0438 \u044f \u043d\u0435 \u043f\u043e\u043c\u043d\u044e. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2013 \u044d\u0442\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0434\u043e\u0431\u0440\u0430\u044f \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u2013 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0417\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\u00a0\u00a0<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0422\u0438\u043c\u0443\u0440 \u0428\u0430\u0444\u0438\u0433\u0443\u043b\u0438\u043d, \u044f \u2013 iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 <a href=\"http:\/\/hh.ru\">hh.ru<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Nivelir<\/h2>\n<p>\u0412 <a href=\"https:\/\/www.google.com\/url?q=https:\/\/habr.com\/ru\/company\/hh\/blog\/659523\/&amp;sa=D&amp;source=docs&amp;ust=1654080039343323&amp;usg=AOvVaw3wKLjP0Iwb6JeUqac0RqLD\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0443\u0436\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0431\u0437\u043e\u0440 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u2013 \u044d\u0442\u043e Badoo \u0438 RouteComposer. \u041e\u043d\u0438 \u043e\u0431\u0430 \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043d\u0430\u0448\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0438 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 \u0435\u0433\u043e Nivelir. <\/p>\n<p><strong>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0438 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>ScreenNavigator<\/strong> \u043d\u0430\u0432\u0438\u0433\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0441 \u0432\u0430\u0448\u0438\u043c <code>UIWindow<\/code>, \u0438\u0449\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><strong>ScreenAction<\/strong> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438: \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0432 \u0441\u0442\u0435\u043a etc.;<\/p>\n<\/li>\n<li>\n<p><strong>Screen<\/strong> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0440\u0430\u043d \u0438 \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432 \u043d\u0435\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u2013 <a href=\"https:\/\/github.com\/hhru\/Nivelir\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<h2>\u041a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u2013 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u044b. <strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u0432 \u044d\u0442\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u2013 <u>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f<\/u>. \u0421\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0441 Nivelir \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. <\/p>\n<pre><code class=\"swift\">private func showChat(id: Int) {     screenNavigator.navigate(from: stack) { route in         route.push(             ChatScreen(                 roomID: roomID,                 chatID: id             )         )     } }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0438\u043c ScreenNavigator \u0441\u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0441 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f UINavigationController), \u0437\u0430\u0442\u0435\u043c \u043f\u0438\u0448\u0435\u043c <code>route.push(_:)<\/code> \u0438 \u043a\u043b\u0430\u0434\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0432 \u0441\u0442\u0435\u043a \u2013 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0422\u0430\u043a\u0436\u0435 Nivelir \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442 \u0441 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c\u0438 \u0438\u0437 UIKit: UIAlertController, UIDocumentInteractionController, UIImagePickerController \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438. <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c ActionSheet (UIAlertController \u0441 \u0442\u0438\u043f\u043e\u043c .actionSheet \u0438\u0437 UIKit) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Nivelir. <\/p>\n<pre><code class=\"swift\">private func pickPhotoImage(sender: UIView) {     let actionSheet = ActionSheet(         anchor: .center(of: sender),         actions: [             ActionSheetAction(title: \"Take Photo\") {                 self.pickPhotoImageFromCamera()             },             ActionSheetAction(title: \"Choose Photo\") {                 self.pickPhotoImageFromPhotoLibrary()             },             .cancel(title: \"Cancel\")         ]     )      screenNavigator.navigate(from: self) { route in         route.showActionSheet(actionSheet)     } }<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e ActionSheet \u0438 Alert \u0432 Nivelir \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c anchor. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f iPad, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u0442\u0435 UIAlertController \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c UIKit \u0442\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043a\u0440\u0430\u0448 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 actions \u2013 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c: \u043a\u0430\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c ActionSheet. \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e\u0442 ActionSheet, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f ScreenAction \u0447\u0435\u0440\u0435\u0437 Route \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>showActionSheet(_:)<\/code>, \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. <\/p>\n<p><strong>\u0412\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f. \u041e\u043d\u0438 \u0432 Nivelir \u0431\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u0433\u0434\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 UIWindow) \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0437\u0434\u0435\u0441\u044c: &#171;\u043d\u0430\u0439\u0434\u0438 \u0442\u043e\u043f\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043a, \u0437\u0430\u043a\u0440\u043e\u0439 \u043d\u0430 \u043d\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043a\u0440\u0430\u043d \u0438 \u043f\u043e\u043b\u043e\u0436\u0438 \u0432 \u043d\u0435\u0433\u043e \u043d\u043e\u0432\u044b\u0439&#187;. <\/p>\n<pre><code class=\"swift\">func openSupportScreen() {     navigator.navigate { route in         route             .top(.stack)             .dismiss()             .push(screens.supportScreen())     } }<\/code><\/pre>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0449\u0435\u043c UITabBarController, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0430\u0431 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 0 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c UINavigationController. \u0423\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0442\u044d\u043a\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c\u0443 \u044d\u043a\u0440\u0430\u043d\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>popToRoot()<\/code>. <\/p>\n<pre><code class=\"swift\">func showRootVacancyScreen() {     navigator.navigate { route in         route             .first(.tabs)             .selectTab(of: UINavigationController.self, with: .index(0)) { route in                 route.popToRoot()             }     } }<\/code><\/pre>\n<p>\u041d\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u044f\u0436\u0435\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u043e\u0443\u0442\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0432 \u043d\u0438\u0445. <\/p>\n<pre><code class=\"swift\">let presentChatRoute = ScreenModalRoute .initial .present(screens.chatScreen(roomID: 1, chatID: 2))  let pushChatRoute = ScreenStackRoute .initial .push( screens.chatScreen(roomID: 1, chatID: 1),  route: presentChatRoute )<\/code><\/pre>\n<p>\u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u043d\u0430 \u0434\u0432\u0430 \u0440\u043e\u0443\u0442\u0430 \u2013 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e present \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e push. \u042d\u0442\u0438 \u0440\u043e\u0443\u0442\u044b \u043c\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>route<\/strong>.<\/p>\n<pre><code class=\"swift\">navigator.navigate { route in     route         .first(.tabs)         .selectTab(         of: UINavigationController.self,          with: .index(0),          route: pushChatRoute         ) }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0442\u0430\u0431 \u0441 \u0442\u0438\u043f\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 UINavigationController, \u0437\u0430\u043f\u0443\u0448\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0447\u0430\u0442\u0430, \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u0437\u0430\u043f\u0443\u0448\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u044d\u043a\u0440\u0430\u043d \u0447\u0430\u0442\u0430.<\/p>\n<p>\u0421\u0430\u043c\u0438 \u0440\u043e\u0443\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0442\u0438\u043f\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. <\/p>\n<pre><code class=\"swift\">public typealias ScreenModalRoute = ScreenRootRoute&lt;UIViewController> public typealias ScreenStackRoute = ScreenRootRoute&lt;UINavigationController> public typealias ScreenTabsRoute = ScreenRootRoute&lt;UITabBarController> public typealias ScreenWindowRoute = ScreenRootRoute&lt;UIWindow><\/code><\/pre>\n<p>ScreenModalRoute \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0434\u043b\u044f UIVievController. \u0410 ScreenStakRoute \u0443\u0436\u0435 \u0441\u043c\u043e\u0436\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0442\u044c push, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0438\u043f\u043e\u043c \u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f UINavigationController. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438 ScreenTabsRoute \u0438 ScreenWindowRoute.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0435\u0440\u0442\u0430 Nivelir \u2013 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430. <\/p>\n<pre><code class=\"swift\">private func showChainNavigation() {     screenNavigator.navigate(from: stack) { route in         route             .push(screens.chatScreen(roomID: roomID, chatID: 1))             .pop()             .push(screens.chatScreen(roomID: roomID, chatID: 2))             .push(screens.chatScreen(roomID: roomID, chatID: 3)) { route in                 route.present(screens.chatScreen(roomID: roomID, chatID: 4))             }     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c push \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u0447\u0430\u0442\u043e\u043c \u043d\u043e\u043c\u0435\u0440 \u043e\u0434\u0438\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u0443\u0448\u0430 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u043e\u0432 \u0438 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439. Nivelir \u0441\u043a\u043b\u0435\u0438\u0442 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u0432 \u043e\u0434\u043d\u0443, \u0447\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u2013 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p><strong>\u0422\u0440\u0435\u0442\u0438\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u043f\u043e\u0438\u0441\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c route, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<pre><code class=\"swift\">func showChatRoute(roomID: Int, chatID: Int) -> ScreenWindowRoute {     let screen = chatScreen(roomID: roomID, chatID: chatID)      return ScreenWindowRoute()         .last(.container(key: screen.key))         .makeVisible()         .refresh()         .resolve() }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c screen. \u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c UIViewController, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u2013 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Screen \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439 \u0434\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c route \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0430. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c ScreenWindowRoute, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c UIWindow. \u041c\u0435\u0442\u043e\u0434 <code>last(_:)<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e UITabBarController \u0441 \u043a\u043e\u043d\u0446\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0439\u0434\u0435\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u0431. \u0415\u0441\u043b\u0438 \u0432 \u0442\u0430\u0431\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f UINavigationController, \u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u043c \u0441 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0435\u043a\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>makeVisible()<\/code>. \u041e\u043d \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u044d\u043a\u0440\u0430\u043d \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u0448\u0438\u043c\u0438 \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u2013 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442 \u0442\u0430\u0431 \u043a \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043a\u0440\u0430\u043d\u0443, \u0430 \u0432 \u0441\u0442\u0435\u043a\u0435 \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u043a \u044d\u043a\u0440\u0430\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>refresh()<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0448 \u0440\u043e\u0443\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0448\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>resolve()<\/code>.<\/p>\n<p><strong>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 DSL. \u041c\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0443 \u0443\u0441\u0438\u043b\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0432 \u043a\u043e\u0434\u0435 \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0412\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c auto-complete \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a UITabBarController \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0443 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0430\u0431. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u043c \u044d\u043a\u0440\u0430\u043d \u0441 \u0447\u0430\u0442\u043e\u043c, \u0430 \u043f\u043e\u0432\u0435\u0440\u0445 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0435\u0449\u0435 \u0438 UIAlertController.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><strong>\u041f\u044f\u0442\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438. \u041c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u0433\u043e\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u0440\u0438\u043c\u0435\u0440: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c ScreenNavigator, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043d\u0430\u0432\u0438\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 \u0442\u0438\u043f\u043e\u043c UIVievController. <\/p>\n<pre><code class=\"swift\">private let container: UIViewController?  private func showChainNavigation() {     screenNavigator.navigate(from: container) { route in     \/\/ \u274c Referencing instance method 'push(_:animation:separated:)'          \/\/ on 'ScreenThenable' requires that 'UIViewController'          \/\/ inherit from 'UINavigationController'         route.push(screens.chatScreen(roomID: roomID, chatID: 1))      } }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>push(_:)<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043a\u043e\u043c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>stack<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e UINavigationController. \u041d\u043e, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 nil \u0438\u043b\u0438 \u0441\u0442\u0435\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0442\u043e Nivelir \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0432\u0430\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0430. <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u044d\u043a\u0440\u0430\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 (\u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u0440\u0438\u043d\u044b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e. <\/p>\n<p><strong>\u0428\u0435\u0441\u0442\u043e\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439<\/strong> \u2013 \u044d\u0442\u043e \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0412 Nivelir \u043c\u043e\u0436\u043d\u043e \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u043d\u0443 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437 \u2013 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e iOS-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 Nivelir \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043d\u043e \u0432\u0430\u043c \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u0435\u0442 \u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441\u043c\u0435\u043d\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b <a href=\"https:\/\/github.com\/hhru\/Nivelir\/blob\/main\/Sources\/Screen\/Actions\/Window\/SetRoot\/Animations\/ScreenRootCustomAnimation.swift\">ScreenRootCustomAnimation<\/a>, \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/hhru\/Nivelir\/blob\/main\/Sources\/Screen\/Actions\/Stack\/SetStack\/Animations\/ScreenStackCustomAnimation.swift\">ScreenStackCustomAnimation<\/a>, \u0434\u043b\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430 <a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uiviewcontrollertransitioningdelegate\">UIViewControllerTransitioningDelegate<\/a> \u0438\u0437 UIKit.<\/p>\n<h2>\u041a\u0440\u0430\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438: \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f<\/h2>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u2013 <strong>\u0433\u0440\u0430\u0444 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438<\/strong>. <strong>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 <\/strong>\u0437\u0434\u0435\u0441\u044c \u2013 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a. \u0412 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u00ab\u043f\u043e\u0438\u0441\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430\u00bb \u043c\u044b \u0443\u0436\u0435 \u0438\u0441\u043a\u0430\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u0441 \u043d\u0443\u0436\u043d\u044b\u043c roomID \u0438 chatID, \u0438, \u0435\u0441\u043b\u0438 \u044d\u043a\u0440\u0430\u043d \u043d\u0435 \u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d, \u043c\u044b \u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0438 \u043d\u0438\u043a\u0430\u043a\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e, \u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c. <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-333959","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333959","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=333959"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333959\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=333959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=333959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=333959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}