рд╕реНрд╡рд┐рдлреНрдЯ 3 рдореЗрдВ iOS рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ 3. рднрд╛рдЧ 2

рдпрд╣ рд▓реЗрдЦ рд╕реНрд╡рд┐рдлреНрдЯ 3 рдкрд░ рдЖрдИрдУрдПрд╕ рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдЦ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рднрд╛рдЧ 1 рдФрд░ рд╕реНрд╡рд┐рдлреНрдЯ 3 рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдХ рдкреБрд░рд╛рдиреЗ рд▓реЗрдЦ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реИред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд┐рджреНрдзрд╛рдВрдд


рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


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

рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз


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

рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХрд╛ рдпрд╣ рддрд░реАрдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╡реЗрдм рдкреЗрдЬреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдорд╛рдорд▓реЗ рдлреЙрд░реНрдо рд╣реИрдВред рдЬрдм рд╣рдо рд╕рд╛рдЗрдЯ рдкрд░ рдлрд╝реЙрд░реНрдо рднрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдмрдорд┐рдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдз POST рд╣реЛрдЧрд╛ред

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо рдЪреБрдЯрдХреБрд▓реЗ рдХреЛ рд░реИрдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП POST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рд╡реЛрдЯ (рдпрд╛ +1, рдпрд╛ -1) рднреЗрдЬреЗрдВрдЧреЗред

рд╡рд┐рднрд┐рдиреНрди рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ POST рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдорддреМрд░ рдкрд░ рдлреЙрд░реНрдо-рдпреВрдЖрд░рдПрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдорд╛рдирдХреЛрдВ (W3C HTML рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рд░реВрдк рд╣реИ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ HTTP рдХрдиреЗрдХреНрд╢рди рдкрд░ рдирд╣реАрдВ рднреЗрдЬ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕реНрд╡рд┐рдлреНрдЯ рдкреНрд░рдХрд╛рд░ рд╣реИред HTTP рдХрдиреЗрдХреНрд╢рди рдкрд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдПрдХ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рджреЗрд╢реА рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢ рдХреЛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рднрд╛рд╖рд╛ рд╕реЗ рдЗрд╕рдХреА рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред HTTP рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рднрд╛рд╖рд╛ W3C рдорд╛рдирдХ рд╣реИ, рд╣рдорд╛рд░реА рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдлреНрдЯ рд╣реИ, рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рднрд╛рд╖рд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реИред

W3C рдорд╛рдирдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреНрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдорд╛рдирдХ рдХреЗ рдлреЙрд░реНрдо-рдпреВрдЖрд░рдПрд▓-рдПрдиреНрдХреЛрдбреЗрдб рднрд╛рдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, param1 = var1 & param2 = var2) рдХреЗ рдмрд╛рдж рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

WebView


рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗрдм рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд░реНрд╕ рдпрд╣реА рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЙрддреНрддрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╣реИред HTML рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рдкреЗрдЬ рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдорд╛рд░реНрдХрдЕрдк рдЯреИрдЧ рдХреЛ рд░реЗрдЦрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпреЗ рдирд┐рдпрдо рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди W3C рдорд╛рдирдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП рдкреВрд░реЗ рдкреГрд╖реНрда рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдПрдХ рдХрдард┐рди рдХрд╛рд░реНрдп рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, iOS рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд UIWebView рдШрдЯрдХ рд╣реИ рдЬреЛ рдкреНрд░рд╕рд┐рджреНрдз WebKit рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ HTML / CSS / рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ UIView рдХреЗ рдЕрдВрджрд░ рдкреВрд░реЗ рд╡реЗрдм рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

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

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

webView:shouldStartLoadWithRequest:navigationType: webViewDidStartLoad: webViewDidFinishLoad: webView:didFailLoadWithError: 

рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рдпрд╛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рддреАрди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реВрдЪрдирд╛рддреНрдордХ рдШрдЯрдирд╛рдПрдБ рд╣реИрдВ (рд╡рд┐рдзрд┐ рдирд╛рдо рдШрдЯрдирд╛ рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддреЗ рд╣реИрдВ)ред

POST рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорддрджрд╛рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╣рдо MainViewController.swift рдФрд░ HTTPCommunication.swift рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ , рдФрд░ рдПрдХ рдирдИ WebViewController.swift рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ webView рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирдпрд╛ WebViewController.swift рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ WebViewController рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

WebViewController.swift

 import UIKit class WebViewController: UIViewController { } extension WebViewController { } 

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╕рднреА HTTP рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ POST рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: HTTPCommunication рд╡рд░реНрдЧред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, HTTPCommunication.swift рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреЛрд╕реНрдЯрд░реНрд▓ (_: params: рдкреВрд░реНрдгрд╣реИрдВрдбрд▓рд░ :) рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдкрд┐рдЫрд▓реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд╕рдорд╛рди рд╣реИ (_: рдкреВрд░реНрдгрд╣реИрдВрдбрд▓рд░ :) рд╡рд┐рдзрд┐ред

HTTPCommunication.swift

 class HTTPCommunication: NSObject { тАж func retrieveURL(_ url: URL, completionHandler: @escaping ((Data) -> Void)) { тАж } // TODO:    } // end of class HTTPCommunication 

рд╡рд┐рдзрд┐ рдХреЛрдб

 func postURL(_ url: URL, params: [String: Int], completionHandler: @escaping ((Data) -> Void)) { // (K.1) self.completionHandler = completionHandler // (K.2) func postBody(params: [String: Int]) -> Data? { // (K.3) var paramsArr: [String] = [] for (key, value) in params { paramsArr.append("\(key)=\(value)") } let postBodyString: String = paramsArr.joined(separator: "&") let postBodyData: Data? = postBodyString.data(using: .utf8) return postBodyData } var request: URLRequest = URLRequest(url: url) // (K.4) request.httpMethod = "POST" request.httpBody = postBody(params: params) let session: URLSession = URLSession(configuration: .default, delegate: self, delegateQueue: nil) // (K.5) let task: URLSessionDownloadTask = session.downloadTask(with: request) task.resume() } 

(K.1) рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ @ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред
(K.2) рд╣рдо рдкреВрд░реНрдг рдмрдВрджрд╣реИрдВрдбрд▓рд░ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд╛рд░рд┐рдд рдмрдВрдж рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред
(K.3) рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ utf8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдирдХреЛрдб рдХрд░рддреА рд╣реИред
(K.4) рд╣рдо рдЙрддреНрддреАрд░реНрдг url рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ: POST рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ utf8 рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдорд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВред
(K.5) рдЕрдВрдд рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕реНрд╡рдпрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рддреНрд░ рдмрдирд╛рдПрдВред рдФрд░ рд╣рдо рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдХрд╛рд░реНрдп рдХреЛ рдбреАрдлреНрд░реЙрд╕реНрдЯ рдХрд░реЗрдВред

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

MainViewController.swift рдореЗрдВ, рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб votUpButton, рд╡реЛрдЯрдбрд╛рдЙрдирдмрдЯрди рдФрд░ chuckWhoButton рдбрд╛рд▓реЗрдВред

MainViewController.swift

 lazy var jokeLabel: UILabel! = тАж var jokeID: Int! lazy var activityView: UIActivityIndicatorView! = тАж //TODO:    lazy var stackView: UIStackView! = тАж 

рдмрдЯрди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб
 lazy var voteUpButton: UIButton! = { // (L.1) let button: UIButton = UIButton(type: .system) // (L.2) button.setTitle("Vote Up", for: .normal) button.sizeToFit() button.addTarget(self, action: #selector(self.voteUp), for: .touchUpInside) // (L.3) self.view.addSubview(button) // (L.4) return button // (L.5) }() lazy var voteDownButton: UIButton! = { let button: UIButton = UIButton(type: .system) button.setTitle("Vote Down", for: .normal) button.sizeToFit() button.addTarget(self, action: #selector(self.voteDown), for: .touchUpInside) self.view.addSubview(button) return button }() lazy var chuckWhoButton: UIButton! = { let button: UIButton = UIButton(type: .system) button.setTitle("Chuck Who?", for: .normal) button.sizeToFit() button.addTarget(self, action: #selector(self.chuckWho), for: .touchUpInside) self.view.addSubview(button) return button }() 

рддреАрдиреЛрдВ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рд╕рдорд╛рди рд╣реИред

(рдПрд▓ред 1) рд╣рдо рдПрдХ рдЖрд▓рд╕реА рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
(L.2) рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдмрдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░, рдирд╛рдо рдФрд░ рдЖрдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
(L.3) рд╣рдо рдмрдЯрди рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЬрдм рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
(L.4) рджреГрд╢реНрдп рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
(L.5) рдФрд░ рд╣рдо рдЗрд╕ рд╕реНрдерд╛рдиреАрдп рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдЖрд▓рд╕реА рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж, MainViewController.swift рдореЗрдВ, рдмрдЯрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛрдб рдбрд╛рд▓реЗрдВ

MainViewController.swift

 class MainViewController: UIViewController { тАж func retrieveRandomJokes() { тАж } // TODO:    } // end of class MainViewController 

рдмрдЯрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛрдб
 func voteUp() { let http: HTTPCommunication = HTTPCommunication() // (M.1) let params: [String: Int] = ["joke_id": self.jokeID, "vote": 1] // (M.2) if let url = URL(string: "http://example.com/rater/vote") { // (M.3) http.postURL(url, params: params) { (data) in // (M.4) print("\(data). Voted Up") } } } func voteDown() { let http: HTTPCommunication = HTTPCommunication() let params: [String: Int] = ["joke_id": self.jokeID, "vote": -1] if let url = URL(string: "http://example.com/rater/vote") { http.postURL(url, params: params) { (data) in print("\(data). Voted Down") } } } func chuckWho() { } 

рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдорддрджрд╛рди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдХреЛрдб рд╕рдорд╛рди рд╣реИред

(M.1) рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред
(M.2) рд╣рдо рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдорддрджрд╛рди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдордЬрд╛рдХ рдХреА рдЖрдИрдбреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡реЛрдЯ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп +1 рдпрд╛ -1 рд╣реЛрддрд╛ рд╣реИред
(M.3) рдЕрдЧрд▓рд╛, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЛрдореЗрди http://example.com/rater/vote. рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рд╕реЗ url рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ http://example.com/rater/vote.
(M.4) рдФрд░ рд╣рдо POST рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВред рдФрд░ рдХрдВрд╕реЛрд▓ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ рдЬреЛ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, MainViewController.swift рдореЗрдВ рд╣рдо UI рдХреЛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, configStackView рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

MainViewController.swift

 func configStackView() -> UIStackView { let innerStackView: UIStackView = UIStackView(arrangedSubviews: [self.voteUpButton, self.voteDownButton]) // (N.1) innerStackView.axis = .horizontal // (N.2) innerStackView.distribution = .fillEqually let mainStackView: UIStackView = UIStackView(arrangedSubviews: [self.jokeLabel, innerStackView, self.chuckWhoButton]) // (N.3) mainStackView.spacing = 50 // (N.4) mainStackView.axis = .vertical mainStackView.distribution = .fillEqually self.view.addSubview(mainStackView) // (N.5) return mainStackView } 

(N.1) рд╡реЛрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдирд░рд╕реНрдЯреИрдХ рд╡реНрдпреВ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдмрдЯрди рд╣реЛрдВред
(рдПрдиред 2) рд╣рдо рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдЕрдХреНрд╖ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ; рд╡рд┐рддрд░рдг рд╕рдорд╛рди рд╣реИред
(N.3) рдореБрдЦреНрдп рдореЗрдирд╕реНрдЯреИрдХ рд╡реНрдпреВ рдореЗрдВ, рдЗрдирд░рд╕реНрдЯреИрдХ рд╡реНрдпреВ рдФрд░ рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрдЯрди рдХреЛ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд╕реЗ рд▓реЗрдмрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
(N.4) рдореЗрдирд╕реНрдЯреИрдХ рд╡реНрдпреВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
(N.5) рдореЗрдирд╕реНрдЯреИрдХ рд╡реНрдпреВ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

рд╣рдо рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдВрдЬреАрд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред 1


рдЕрдВрдЬреАрд░ред 1 рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдмрдЯрди рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕

рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдордЬрд╛рдХ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЙрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдорддрджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:

345 bytes. Voted Up

рдпрд╛

345 bytes. Voted Down

рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП POST рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╣рдордиреЗ icndb API рдФрд░ GET HTTP рд╡рд░реНрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдордЬрд╛рдХрд┐рдпрд╛ рдЖрд╡реЗрджрди рд▓рд┐рдЦрд╛ рд╣реИред рд╣рдо UIView рдкрд░ рдЗрди рдЪреБрдЯрдХреБрд▓реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ рдФрд░ рд╣рд░ рдордЬрд╛рдХ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рдЕрдиреБрдорд╛рди рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡реЗрдм рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП webViews рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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

WebViewController.swift рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯрдм рд▓рд┐рдЦреЗрдВ:

WebViewController.swift

 import UIKit class WebViewController: UIViewController { lazy var webView: UIWebView = { // (O.1) self.configWebView() }() lazy var toolbar: UIToolbar = { // (O.2) self.configToolbar() }() override func viewDidLoad() { super.viewDidLoad() } func back() { // (O.3) self.webView.goBack() } func forward() { self.webView.goForward() } } extension WebViewController { func configWebView() -> UIWebView { // (O.4) } func configToolbar() -> UIToolbar { // (O.5) } func configConstraints() { // (O.6) } } 

(O.1) рд╣рдо webView рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рдЪрд░ рдмрдирд╛рддреЗ рд╣реИрдВ
(O.2) рдФрд░ рдЯреВрд▓рдмрд╛рд░ред
(O.3) рд╣рдо рд▓рд┐рдВрдХ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдХреЗ рддрд░реАрдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВред
(O.4) рд╣рдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ webView рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
(O.5) рдФрд░ рдЯреВрд▓рдмрд╛рд░
(O.6) рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛ред

рдЕрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рдкреЗрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 func configWebView() -> UIWebView { let webView: UIWebView = UIWebView() // (P.1) self.view.addSubview(webView) return webView } 

(P.1) рд╣рдо рд╡реЗрдм рд╡реНрдпреВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рджреГрд╢реНрдп рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

 func configToolbar() -> UIToolbar { let toolbar: UIToolbar = UIToolbar(frame: CGRect.zero) // (Q.1) let backButton: UIBarButtonItem = UIBarButtonItem(title: "<", style: .plain, target: self, action: #selector(self.back)) // (Q.2) let forwardButton: UIBarButtonItem = UIBarButtonItem(title: ">", style: .plain, target: self, action: #selector(self.forward)) toolbar.setItems([backButton, forwardButton], animated: false) // (Q.3) toolbar.backgroundColor = UIColor.lightGray // (Q.4) self.view.addSubview(toolbar) return toolbar } 

(Q.1) рд╢реВрдиреНрдп рдлреНрд░реЗрдо рд╡рд╛рд▓рд╛ рдЯреВрд▓рдмрд╛рд░ рдмрдирд╛рдПрдВред
(Q.2) рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓рд┐рдВрдХ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрдЯрди рдмрдирд╛рддреЗ рд╣реИрдВред рдирд╛рдо рдХреЗ рд╕рд╛рде "<" рдФрд░ ">" рдФрд░ рдХреНрд░рд┐рдпрд╛рдПрдБ рд╡реЗрдм рджреГрд╢реНрдп рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐ рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВред
(Q.3) рдЗрди рдмрдЯрдиреЛрдВ рдХреЛ рдЯреВрд▓рдмрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
(Q.4) рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд▓рд░ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рдирдмрд╛рд░, рд▓рд╛рдЗрдЯ рдЧреНрд░реЗред рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВред

 func configConstraints() { self.webView.translatesAutoresizingMaskIntoConstraints = false // (R.1) NSLayoutConstraint.activate([ // (R.2) self.webView.topAnchor.constraint(equalTo: self.topLayoutGuide.topAnchor), self.webView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), self.webView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), self.webView.bottomAnchor.constraint(equalTo: self.toolbar.topAnchor) ]) self.toolbar.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ // (R.3) self.toolbar.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), self.toolbar.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), self.toolbar.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), self.toolbar.heightAnchor.constraint(equalToConstant: 44.0) ]) } 

(R.1) рдСрдЯреЛрд░рд╛рдЗрдЬрд╝рд┐рдВрдЧ рдорд╛рд╕реНрдХ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рд╣рдорд╛рд░реЗ рдЕрд╡рд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рди рдХрд░реЗрдВ
(R.2) рд╡реЗрдм рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП, рджреГрд╢реНрдп рдХреЗ рд╕рднреА рдЪрд╛рд░ рдкрдХреНрд╖реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
(R.3) рдЯреВрд▓рдмрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╢реАрд░реНрд╖ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреГрд╢реНрдп рдХреЗ рддреАрди рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдКрдВрдЪрд╛рдИ рдХреЛ рдорд╛рдирдХ 14.0 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред

рдФрд░ рдХреЛрдб ViewDidLoad () рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:

 override func viewDidLoad() { super.viewDidLoad() self.configConstraints() // (S.1) if let url = URL(string: "http://en.wikipedia.org/wiki/Chuck_Norris") { // (S.2) let request: URLRequest = URLRequest(url: url) // (S.3) self.webView.loadRequest(request) // (S.4) } } 

(рдПрд╕ .рез) рдмрд╛рдзрд╛рдУрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░реЗрдВред
(S.2) рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкреГрд╖реНрда en.wikipedia.org/wiki/Chuck_Norris рдХреЗ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдпреВрдЖрд░рдПрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
(S.3) рд╣рдо url рд╕реЗ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддреЗ рд╣реИрдВред
(S.4) рдФрд░ рд╣рдо webView рдореЗрдВ рджрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо MainViewController рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╕реЗ рднрд░рддреЗ рд╣реИрдВред

MainViewController.swift

 func chuckWho() { self.navigationController?.show(WebViewController(), sender: self) // (T.1) } 

(T.1) рдЬрдм рдЖрдк рдиреЗрд╡рд┐рдЧреЗрд╢рдирдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реНрдЯреИрдХ рдкрд░ рдЗрд╕ рдмрдЯрди рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗрдм рд╡реНрдпреВ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдбрд╛рд▓реЗрдВред

рдЕрдВрдЬреАрд░ред 2 рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрд╡реНрдпреВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред


рдЕрдВрдЬреАрд░ред 2. рд╡реЗрдм рд╡реНрдпреВ рдХрд╛ рдЕрдВрддрд┐рдо рджреГрд╢реНрдп рд╣рдордиреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ

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


All Articles