рдкрд░рд┐рдЪрдп
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ iOS рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХреЛрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ SQLite рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде iPhone рдХреЛрд░ рдбреЗрдЯрд╛ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдкрд░рд╕реНрдкрд░ рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рдВрдмрдВрдзрд┐рдд рдЕрднрд┐рд▓реЗрдЦреЛрдВ (рд╕рдВрдмрдВрдзреЛрдВ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЗрдВ
рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдПрдХ рдорд╛рдирдХ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕
- Xcode
рдпрд╣ рд╕реЗрдЯ рдЖрдкрдХреЛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рджреЗрдЦрдиреЗ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ iPhone рдкрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ iOS рдбреЗрд╡рд▓рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рднрд╛рдЧреАрджрд╛рд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ-рд╕реА рднрд╛рд╖рд╛ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рд╕рдиреНрджрд░реНрдн рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдХреНрдпрд╛ рд╣реИ iPhone рдХреЛрд░ рдбрд╛рдЯрд╛ рд░реЗрд╕рд┐рдкреА?
Xcode Apple рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ iPhone рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░, рдЯреЗрдмрд▓ рд╡реНрдпреВ рдФрд░ рдХреЛрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЖрдИрдкреИрдб рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдИрдкреИрдб рдкрд░ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
iPhone рдХреЛрд░ рдбреЗрдЯрд╛ рд╡реНрдпрдВрдЬрдиреЛрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рджреЗрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рд╡реНрдпрдВрдЬрдиреЛрдВ рд╡рд┐рдВрдбреЛ рдореЗрдВ, рддреИрдпрд╛рд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рдЙрддреНрдкрд╛рдж рдХреЛ рдХреИрд╕реЗ рдкрдХрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╢реНрд░реЗрдгреА, рдХрд┐рддрдирд╛ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдФрд░ рдХрд┐рддрдиреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдмрдЯрди рдЬреЛ рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдмреНрджрд┐рдХ рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрд╡реЗрджрди рдореЗрдВ рдЧреНрд░рд╛рдо, рдкрд╛рдЙрдВрдб рдФрд░ рдФрдВрд╕, рд╕рд╛рде рд╣реА рддрд╛рдкрдорд╛рди рдкрддреНрд░рд╛рдЪрд╛рд░ (рд╕реЗрд▓реНрд╕рд┐рдпрд╕ рдФрд░ рдлрд╝рд╛рд░реЗрдирд╣рд╛рдЗрдЯ) рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмреАрдЪ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред


рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛
рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдиреАрдЪреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдЖрдк Xcode рдореЗрдВ Recipes.xcdatamodel рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдХрд░ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди
рдкрдХрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдирд┐рд░реНрджреЗрд╢
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд╛рдо
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░
- рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкреВрд░реНрд╡-рд╕рдордп
- рдердВрдмрдиреЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрдмрд▓
рд╕рдВрдШрдЯрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкреНрд░рдХрд╛рд░
- рдкреНрд░рджрд░реНрд╢рдирдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ 16
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд╛рдо
рд░реЗрд╕рд┐рдкреА рдЯрд╛рдЗрдк рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдирд╛рдо
рдЫрд╡рд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
- рдкреНрд░рдХрд╛рд░ рдХреА рдЫрд╡рд┐
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрдмрд▓ рд╣реИ? рдХреЛрд░ рдбреЗрдЯрд╛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рджрд┐рдирд╛рдВрдХ, рдпрд╛ рд╕рдВрдЦреНрдпрд╛ред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рд╕реАрдзреЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪрд┐рддреНрд░ рдпрд╛ рд░рдВрдЧ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ NSImage рдФрд░ NSColor рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрдмрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг, рдЖрдк рдЧреИрд░-рдорд╛рдирдХ рд╕реНрдерд╛рдпреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ iOS рдбреЗрд╡рд▓рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рдВрджрд░реНрдн рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ)ред
рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз
рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдПрдХ рдореБрдЦреНрдп рдиреБрд╕реНрдЦрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рддреАрди рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдиреЗрдХреНрд╢рди рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реЗрд╕рд┐рдкреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдШрдЯрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдПрдХ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдз рд╣реЛрддреЗ рд╣реИрдВред рд╕рдВрдЪрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рджрд┐рд╢рд╛ рдХреЛ рддреАрд░реЛрдВ рдФрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реЗрд╕рд┐рдкреА рдЯреЗрдмрд▓ рдХрд╛ рд░реЗрд╕рд┐рдкреА рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдПрдХ-рд╕реЗ-рдПрдХ рд╕рдВрдмрдВрдз рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░реЗрд╕рд┐рдкреА рдЯреЗрдмрд▓ рдХрд╛ рд░реЗрд╕рд┐рдкреА рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдПрдХ-рд╕реЗ-рдХрдИ рд╕рдВрдмрдВрдз рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рджреЛрддрд░рдлрд╛ рд╕рдВрдЪрд╛рд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд░реЗрд╕рд┐рдкреА рдЯреЗрдмрд▓ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд░реЗрд╕рд┐рдкреА рдЯреЗрдмрд▓ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд░реЗрд╕рд┐рдкреА рдЯреЗрдмрд▓ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд░рд┐рдХрд╛рдЗрдк рдЯреЗрдмрд▓ рд╕реЗ рдХрдИ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЙрддреНрдкрд╛рдж рдХреЗрд╡рд▓ рдПрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЙрддреНрдкрд╛рдж рднреА рдЙрд╕реА рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрд╕рд░реНрдЯ рд╢реНрд░реЗрдгреА рдореЗрдВред
рдХреЛрд░ рдбреЗрдЯрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдВрдмрдВрдз рдХрд╛ рдкреНрд░рдХрд╛рд░ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рд╕рдВрдмрдВрдз рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред

рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп, рдХрдиреЗрдХреНрд╢рди рдЧреБрдгреЛрдВ рдореЗрдВ рд╣рдЯрд╛рдП рдЧрдП рдирд┐рдпрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЬрдм рдХреЛрдИ рдЙрддреНрдкрд╛рдж рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рд╕рднреА рдЕрд╡рдпрд╡ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдХрдХреНрд╖рд╛рдПрдВ
рдбреЗрдЯрд╛рдмреЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреНрд▓рд╛рд╕реЗрд╕ рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдиреБрд╕реНрдЦрд╛ рдФрд░ рд╕рдВрдШрдЯрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред
Recipe.h@interface ImageToDataTransformer : NSValueTransformer { } @end @interface Recipe : NSManagedObject { } @property (nonatomic, retain) NSString *instructions; @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSString *overview; @property (nonatomic, retain) NSString *prepTime; @property (nonatomic, retain) NSSet *ingredients; @property (nonatomic, retain) UIImage *thumbnailImage; @property (nonatomic, retain) NSManagedObject *image; @property (nonatomic, retain) NSManagedObject *type; @end @interface Recipe (CoreDataGeneratedAccessors) - (void)addIngredientsObject:(NSManagedObject *)value; - (void)removeIngredientsObject:(NSManagedObject *)value; - (void)addIngredients:(NSSet *)value; - (void)removeIngredients:(NSSet *)value; @end
Ingredient.h @class Recipe; @interface Ingredient : NSManagedObject { } @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSString *amount; @property (nonatomic, retain) Recipe *recipe; @property (nonatomic, retain) NSNumber *displayOrder; @end
рд╕реНрд░реЛрдд рдХреЛрдб
рд╣рдо рдЖрд╡реЗрджрди рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рджреМрд░рд╛рди рд╕реНрд░реЛрдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
RecipesAppDelegate.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ NSManagedObjectModel, NSManagedObjectContext рдФрд░ NSPersistentStoreCoordinator рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ:
@class RecipeListTableViewController; @interface RecipesAppDelegate : NSObject <UIApplicationDelegate> { NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator; } @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (NSString *)applicationDocumentsDirectory; @end
RecipesAppDelegate.m рдлрд╝рд╛рдЗрд▓ рдЗрди рдЧреБрдгреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИ рдФрд░ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╕реБрд╕рдВрдЧрдд рд╣реИред
... - (void)applicationDidFinishLaunching:(UIApplication *)application { recipeListController.managedObjectContext = self.managedObjectContext; ... } // , , - (void)applicationWillTerminate:(UIApplication *)application { NSError *error; if (managedObjectContext != nil) { if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } } } // NSManagedObjectContext, - (NSManagedObjectContext *)managedObjectContext { if (managedObjectContext != nil) { return managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext = [NSManagedObjectContext new]; [managedObjectContext setPersistentStoreCoordinator: coordinator]; } return managedObjectContext; } // NSManagedObjectModel, - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return managedObjectModel; } // NSPersistentStoreCoordinator, . NSPersistentStoreCoordinator - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) { return persistentStoreCoordinator; } NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"Recipes.sqlite"]; /* , , . . */ NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:storePath]) { NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Recipes" ofType:@"sqlite"]; if (defaultStorePath) { [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; } } NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; NSError *error; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return persistentStoreCoordinator; } // Documents - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; } ...
рдЕрдм, рд╣рдореЗрдВ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
RecipeListTableViewController.m рдлрд╝рд╛рдЗрд▓
(RecipeListTableViewController рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рд╣реИ
... // Recipe - (NSFetchedResultsController *)fetchedResultsController { if (fetchedResultsController == nil) { NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@ inManagedObjectContext:managedObjectContext]; [fetchRequest setEntity:entity]; // NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@ ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@]; aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController; [aFetchedResultsController release]; [fetchRequest release]; [sortDescriptor release]; [sortDescriptors release]; } return fetchedResultsController; } ... - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // RecipeTableViewCell . RecipeTableViewCell UITableViewCell static NSString *RecipeCellIdentifier = @; RecipeTableViewCell *recipeCell = (RecipeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:RecipeCellIdentifier]; if (recipeCell == nil) { recipeCell = [[[RecipeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:RecipeCellIdentifier] autorelease]; recipeCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } [self configureCell:recipeCell atIndexPath:indexPath]; return recipeCell; } - (void)configureCell:(RecipeTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { // Recipe *recipe = (Recipe *)[fetchedResultsController objectAtIndexPath:indexPath]; cell.recipe = recipe; } ...
рд╕рдм рдХреБрдЫ, рдпрд╣ рдХреЛрдб рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рд╕рднреА рдХреЛрдб рдирд╣реАрдВ рджрд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХреЗрд╡рд▓ рдЕрдВрд╢ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, RecipeListTableViewController.m рдлрд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдХрд░ рдЖрдк рдпрд╣ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдирд┐рдЯрд░ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ (didChangeSection, didChangeObject, рдирд┐рдпрдВрддреНрд░рдХWillChangeContent, commEditingStyle, рдЖрджрд┐)ред
рд╣рдо рд╕рд╛рдордЧреНрд░реА рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ RecipeDetailViewController рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд░рдЦрддрд╛ рд╣реИ
Recipe *recipe; NSMutableArray *ingredients; @property (nonatomic, retain) Recipe *recipe; @property (nonatomic, retain) NSMutableArray *ingredients;
RecipeListTableViewController рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ RecipeDetailViewController рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдиреБрд╕реНрдЦрд╛ рдкрд╛рд╕рд┐рдВрдЧ
... // - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Recipe *recipe = (Recipe *)[fetchedResultsController objectAtIndexPath:indexPath]; [self showRecipe:recipe animated:YES]; } ... - (void)showRecipe:(Recipe *)recipe animated:(BOOL)animated { RecipeDetailViewController *detailViewController = [[RecipeDetailViewController alloc] initWithStyle:UITableViewStyleGrouped]; // detailViewController.recipe = recipe; [self.navigationController pushViewController:detailViewController animated:animated]; [detailViewController release]; } ...
рдиреБрд╕реНрдЦрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [photoButton setImage:recipe.thumbnailImage forState:UIControlStateNormal]; self.navigationItem.title = recipe.name; nameTextField.text = recipe.name; overviewTextField.text = recipe.overview; prepTimeTextField.text = recipe.prepTime; [self updatePhotoButton]; // NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1]; NSMutableArray *sortedIngredients = [[NSMutableArray alloc] initWithArray:[recipe.ingredients allObjects]]; [sortedIngredients sortUsingDescriptors:sortDescriptors]; self.ingredients = sortedIngredients; [sortDescriptor release]; [sortDescriptors release]; [sortedIngredients release]; [self.tableView reloadData]; }
TableView cellForRowAtIndexPath рдореЗрдВ рдиреБрд╕реНрдЦрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд▓ рдмрдирд╛рдПрдВ
static NSString *IngredientsCellIdentifier = @"IngredientsCell"; cell = [tableView dequeueReusableCellWithIdentifier:IngredientsCellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:IngredientsCellIdentifier] autorelease]; cell.accessoryType = UITableViewCellAccessoryNone; }
рдпрд╣ рд╕рдм, рдпрд╣ рдХреЛрдб рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рд╕реЗ, рд╣рдо рдЙрд╕ рд░реЗрд╕рд┐рдкреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред рдЙрд╕реА рд╕рдордп, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ NSEntityDescription рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдиреБрд╕реНрдЦрд╛ рдкрд░ рдЬрд╛рдПрдБред рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЧреБрдг рдФрд░ рдХреЛрд░ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдмреЗрд╢рдХ, рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк, рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд▓реЗ рдПрдХ рдореЗрдВ, рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдФрд░ рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рдВрджрд░реНрдн