рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдХреЛ рдкреНрд░рддрд┐рджрд┐рди рдХреИрд╕реЗ рдХрд▓реЗрдХреНрдЯ рдХрд░реЗрдВред рднрд╛рдЧ 1





рд╣реИрдмрд░рд╣рд╛рдм рдХреЗ рдкреНрдпрд╛рд░реЗ рдкрд╛рдардХреЛрдВ!



рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬрд▓реНрджреА рдФрд░ рд▓рдЧрднрдЧ рджрд░реНрдж рд░рд╣рд┐рдд рддрд░реАрдХреЗ рд╕реЗ iOS рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдмрдврд╝рд╛рдПрдВред рдореИрдВ рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрддрд╛ рд╣реВрдВ:



  1. рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛, рд╕рд░рд▓ рдпреВрдЖрдИ, рддреНрд╡рд░рд┐рдд рд╕рдВрджреЗрд╢ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА
  2. рд╣рдо рдПрдХ рд╕реБрдВрджрд░ рдпреВрдЖрдИ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдХреЙрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдлрд╝реЛрдЯреЛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


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



рд░реБрдЪрд┐ рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред



рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг



Xcode рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред







рд╣рдо рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рдВрдЧрд▓ рд╡реНрдпреВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрддреЗ рд╣реИрдВред







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







рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рддреИрдпрд╛рд░ рд╣реИред







рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рднрдпрд╛рдирдХ рдЫрдБрдЯрд╛рдИ! рдЪрд▓реЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред







рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ! рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ рдореИрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЙрдбрд▓ рд╕реЗ рдЪрд┐рдкрдХреЗрдЧрд╛ред рд╡реИрд╕реЗ, рдПрдХ рдирдпрд╛ рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдпреЛрдЬрди рдХрдорд╛рдВрдб + Alt + N рд╣реИред



рд╕рд░рд▓ рдпреВрдЖрдИ



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







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







рдПрдХ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдВ (рдЖрдИрдмреА рдФрд░ рдирдИ рдХрдХреНрд╖рд╛ рдореЗрдВ рдкреНрд░рд╕реНрддреБрддрд┐ рджреЛрдиреЛрдВ) - рдЪреИрдЯ рдХреА рдПрдХ рд╕реВрдЪреАред рд╣рдо рдорд╛рдирдХ рдХреЛрдб UITableViewController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рдЕрд▓реМрдХрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред







NKChatListTableViewController.m рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ:



рдореБрдЭреЗ рдзрдХреНрдХрд╛ рджреЛ!
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; cell.textLabel.text = @"Vasiliy Pupkin"; return cell; }
      
      





рдЕрдм рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдПрдХ UINavigationController рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдзрдХреНрдХрд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред UINavigationController рдореЗрдВ рдЖрд╡реЗрджрди рдХреЛ рдПрдХреАрдХреГрдд! рдЬрд╛рджреВ рдХрд╛ рд╕рдордп рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!







рдХрдВрдЯреНрд░реЛрд▓рд░ рдФрд░ рд╕реЗрдЧ рдХрд╛ рдирд╛рдо рд▓реЙрдЧрд┐рди рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗ рдЪреИрдЯ рд▓рд┐рд╕реНрдЯ рдЯреЗрдмрд▓ рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЪрд▓реЛ рдЗрд╕реЗ "SegueToChatList" рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдЕрдм рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред







рд▓реЙрдЧрд┐рди рд╡реНрдпреВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдкрд░ рдереЛрдбрд╝рд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреАрдмреЛрд░реНрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдкрд╛рда рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрдирд╛ рджреЗрдВрдЧреЗред







рдФрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



NKLoginViewController.h
 #import <UIKit/UIKit.h> //      @interface NKLoginViewController : UIViewController <UITextFieldDelegate> @end
      
      





NKLoginViewController.m
 #import "NKLoginViewController.h" @interface NKLoginViewController () @property (weak, nonatomic) IBOutlet UITextField *emailTextField; @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; - (IBAction)loginTouched:(UIButton *)sender; @end @implementation NKLoginViewController #pragma mark - UITextFieldDelegate - //  ,    "Done"   - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } #pragma mark - Button methods - //           "". - (IBAction)loginTouched:(UIButton *)sender { [self performSegueWithIdentifier:@"SegueToChatList" sender:self]; }
      
      





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



рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА poked рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ!







рдПрдХ рддреАрд╕рд░рд╛ - рдФрд░ рдЕрдВрддрд┐рдо - рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдБред рд╣рдо рдкрд┐рдЫрд▓реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕реЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ UITableView рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдирд┐рдпрдВрддреНрд░рдХ, рдПрдХ рдкрд╛рда рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ рднреЗрдЬреЗрдВ рдмрдЯрди рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдХреНрд░реАрди рд╕рд╣рдЬ рд╣реИред







рдиреАрдЪреЗ NKChatViewController.m рдХреЛрдб:



рдореБрдЭреЗ рдзрдХреНрдХрд╛ рджреЛ!
 #import "NKChatViewController.h" @interface NKChatViewController () @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (weak, nonatomic) IBOutlet UITextField *messageTextField; - (IBAction)sendTouched:(UIButton *)sender; @end @implementation NKChatViewController #pragma mark - View Controller life cycle - - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //  ,      [_messageTextField becomeFirstResponder]; } #pragma mark - UITableViewDataSource - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.textLabel.text = @" "; cell.detailTextLabel.text = @",  ?"; return cell; } #pragma mark - Button methods - - (IBAction)sendTouched:(UIButton *)sender { } @end
      
      





рд╣рдорд╛рд░реЗ рдореИрд╕реЗрдВрдЬрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдпреВрдЖрдИ рддреИрдпрд╛рд░ рд╣реИред рдордЬрд╝рд╛ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╣реЛ рд░рд╣реА рд╣реИ - рдЖрд╡реЗрджрди рднрд░рд╛рдИ!



рддреНрд╡рд░рд┐рдд рд╕рдВрджреЗрд╢ рд╕реЗрд╡рд╛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ



рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдВрджреЗрд╢ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C2Call рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ 24 рдШрдВрдЯреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред



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



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







рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред







рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдкрд░реЗрдЦрд╛ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:



рдЪреМрдЦрдЯреЗ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рднрдпрд╛рд╡рд╣ рд╕реВрдЪреА
AVFoundation.framework

Accounts.framework

AdSupport.framework

AddressBook.framework

AddressBookUI.framework

AssetsLibrary.framework

AudioToolbox.framework

CFNetwork.framework

CoreAudio.framework

CoreData.framework

CoreFoundation.framework

CoreLocation.framework

CoreMedia.framework

CoreTelephony.framework

CoreText.framework

CoreVideo.framework

MapKit.framework

MediaPlayer.framework

MessageUI.framework

MobileCoreServices.framework

OpenGLES.framework

QuartzCore.framework

QuickLook.framework

Security.framework

StoreKit.framework

SystemConfiguration.framework

iAd.framework

libsqlite3.dylib

libz.dylib



рдФрд░ рдмрд┐рд▓реНрдб рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦреЗрдВ:



HEADER_SEARCH_PATHS = / usr / / libxml2 рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

OTHER_LDFLAGS = -lxml2 -lstdc ++

ARCHS = armv7

VALID_ARCHS = armv7



рдЪрд▓рд┐рдП рдЕрдм App рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рддреЗ рд╣реИрдВ:



NKAppDelegate.h
 #import <UIKit/UIKit.h> #import <SocialCommunication/SocialCommunication.h> @interface NKAppDelegate : C2CallAppDelegate <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end
      
      





NKAppDelegate.m
 @implementation NKAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.affiliateid = @"6B9DF5671444320162B"; self.secret = @"2fd9cd18aa4d957a4030c0455101646d"; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end
      
      





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



рдврд╛рдВрдЪреЗ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред



NKChat рдирд╛рдордХ NSObject рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкреВрд░реЗ рдЪреИрдЯ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ NKChat.m рдХреЛрдб рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╕реВрдЪреА рджреЗрдирд╛ рд╕рд╣реА рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рдордЭрд╛рдПрдВред



NKChat.m
 #import "NKChat.h" #import <SocialCommunication/SocialCommunication.h> @implementation NKChat #pragma mark - Singleton pattern - // 1 + (instancetype)sharedManager { static NKChat *sharedChat = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedChat = [self new]; }); return sharedChat; } #pragma mark - Accessors - // 2 - (NSArray *)chatHistory { return [self fetchChatHistory]; } #pragma mark - General methods - // 3 - (void)login:(NSString *)email password:(NSString *)password success:(void(^)())successBlock failure:(void(^)())failureBlock { NSDictionary *dictionary = @{@"EMail":email, @"Password":password}; [[C2CallPhone currentPhone] registerUser:dictionary withCompletionHandler:^(BOOL success, NSString *result) { if (success) { [[C2CallPhone currentPhone] startC2CallPhone]; successBlock(); } else { failureBlock(); } }]; } // 4 - (void)logout { [(C2CallAppDelegate *)[UIApplication sharedApplication].delegate logoutUser]; } // 5 - (void)sendMessage:(NSString *)message toUser:(NSString *)userId { [[C2CallPhone currentPhone] submitMessage:message toUser:userId]; } // 6 - (NSArray *)fetchChatHistory { //   Managed Object   NSFetchRequest *request = [[SCDataManager instance] fetchRequestForChatHistory:YES]; NSFetchedResultsController *controller = [[SCDataManager instance] fetchedResultsControllerWithFetchRequest:request sectionNameKeyPath:nil cacheName:nil]; NSError *error; [controller performFetch:&error]; //    NSMutableArray *result = [NSMutableArray array]; for (NSManagedObject *chat in controller.fetchedObjects) { //    NSArray *chatKeys = @[@"contact", @"lastTimestamp", @"missedEvents"]; NSMutableDictionary *inChat = [[chat dictionaryWithValuesForKeys:chatKeys] mutableCopy]; //    NSMutableDictionary *dublicate = nil; for (NSMutableDictionary *dict in result) { if ([dict[@"contact"] isEqualToString:inChat[@"contact"]]) { dublicate = dict; break; } } //    NSMutableArray *messages = (dublicate) ? dublicate[@"messages"] : [NSMutableArray array]; for (NSManagedObject *chatEvent in [chat valueForKey:@"chatHistory"]) { NSArray *chatEventKeys = [[[chatEvent entity] attributesByName] allKeys]; NSMutableDictionary *inChatEvent = [[chatEvent dictionaryWithValuesForKeys:chatEventKeys] mutableCopy]; // NSLog(@"%@",inChatEvent); inChatEvent[@"ManagedObject"] = chatEvent; [messages addObject:inChatEvent]; } [messages sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"timevalue" ascending:YES]]]; if (dublicate) { dublicate[@"messages"] = messages; [dublicate[@"ManagedObjects"] addObject:chat]; dublicate[@"missedEvents"] = @([dublicate[@"missedEvents"] intValue] + [inChat[@"missedEvents"] intValue]); if (!dublicate[@"name"]) dublicate[@"name"] = inChat[@"name"]; } else { inChat[@"messages"] = messages; inChat[@"ManagedObjects"] = [NSMutableArray arrayWithObject:chat]; } //     if (!dublicate) [result addObject:inChat]; } //   [result sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"lastTimestamp" ascending:NO]]]; //    return [result copy]; } @end
      
      





рдЖрдЗрдП рдЬрд╛рдиреЗ рдХреНрд░рдо рдореЗрдВ:



  1. рдорд╛рдирдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИред рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ - рдЬрд┐рд╕рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  2. рдПрдХ рдПрдХреНрд╕реЗрд╕рд░ рд╡рд┐рдзрд┐ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рдореЗрдВ рдЪреИрдЯ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рддреА рд╣реИред
  3. рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ред C2Call рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд▓реЙрдЧ рдЗрди рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рджреВрд╕рд░реА рдмрд╛рд░ рдЙрд╕реА рдбреЗрдЯрд╛ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рдирд┐: рд╢реБрд▓реНрдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗред рдЖрдк рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП C2Call рд╕реЗ рдПрдХ рдореВрд▓ рдкрдВрдЬреАрдХрд░рдг рд╡рд┐рдВрдбреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  4. рд▓реЙрдЧрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ред рд╕рд╕реНрддрд╛ рдФрд░ рд╣рдВрд╕рдореБрдЦред
  5. рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рднреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
  6. рдПрдХ рднрдпрд╛рдирдХ рдФрд░ рд░рд╛рдХреНрд╖рд╕реА рдореЗрдЬрд╝рдкреЛрд╢ рд╡рд┐рдзрд┐ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЪреИрдЯ рдЗрддрд┐рд╣рд╛рд╕ рд▓реМрдЯрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рд╕рднреА рдкрддреНрдерд░ рд╣реИрдВ рдЬреЛ рдЖрдк C2Call рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдарднреЗрдбрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛ рдХреЛ рдХреЛрд░ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ, рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ рдирд╛рдо рд▓рдЧрд╛рддрд╛рд░ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ - рдпрд╛ рддреЛ рдЖрдИрдбреА рдЖрдПрдЧрд╛, рдлрд┐рд░ рдкрд╣рд▓реЗ рдФрд░ рдЕрдВрддрд┐рдо рдирд╛рдоред рддреАрд╕рд░рд╛, рдЕрдм рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдУред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ :)


рдЦреИрд░, рдЬрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рдХреЛрдб рдХреЗ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!



рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рддреЛ NKAppDelegate.m рдХреЛ NKChat рдЖрд░рдВрднреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВред



NKAppDelegate.m
 #import "NKAppDelegate.h" @implementation NKAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.affiliateid = @"6B9DF5671444320162B"; self.secret = @"2fd9cd18aa4d957a4030c0455101646d"; [NKChat sharedManager]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end
      
      





рдЕрдм NKLoginViewController рдХреНрд▓рд╛рд╕ рдХреЗ рд▓реЙрдЧрдЗрдирдЯрдЪ рд╡рд┐рдзрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрдВред NKChat рдЖрдпрд╛рдд рдХрд░рдирд╛ рдордд рднреВрд▓рдирд╛!



рдореБрдЭреЗ рдзрдХреНрдХрд╛ рджреЛ!
 - (IBAction)loginTouched:(UIButton *)sender { sender.enabled = NO; [[NKChat sharedManager] login:_emailTextField.text password:_passwordTextField.text success:^{ [self performSegueWithIdentifier:@"SegueToChatList" sender:self]; sender.enabled = YES; } failure:^{ sender.enabled = YES; }]; }
      
      





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



рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рджреЛ рдЦрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ: nikita@borodutch.com рдФрд░ luke@borodutch.comред рд╣рдо рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЗрди рджреЛ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред



NKChatListTableViewController.m рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдЗрди рджреЛ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХреЗред



рдореБрдЭреЗ рдзрдХреНрдХрд╛ рджреЛ!
 #import "NKChatListTableViewController.h" @interface NKChatListTableViewController () @end @implementation NKChatListTableViewController #pragma mark - UITableViewDataSource - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 2; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; cell.textLabel.text = (indexPath.row) ? @"nikita@borodutch.com" : @"luke@borodutch.com"; return cell; } @end
      
      





рд╣реЗрд░рдлреЗрд░ рдкрд░рд┐рдгрд╛рдо:







NKChatListTableViewController.m рдореЗрдВ рдЕрдЧрд▓реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред



рдореБрдЭреЗ рдзрдХреНрдХрд╛ рджреЛ!
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell *)sender { UIViewController *dest = segue.destinationViewController; dest.title = sender.textLabel.text; }
      
      





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



рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдХреА рддрд░рд╣, рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде NKChatViewController.m рдХреА рдПрдХ рд╕реВрдЪреА рджреВрдВрдЧрд╛ред



рдореБрдЭреЗ рдзрдХреНрдХрд╛ рджреЛ!
 #import "NKChatViewController.h" #import <SocialCommunication/SocialCommunication.h> #import "NKChat.h" @interface NKChatViewController () @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (weak, nonatomic) IBOutlet UITextField *messageTextField; - (IBAction)sendTouched:(UIButton *)sender; @end @implementation NKChatViewController { NSArray *tableData; } #pragma mark - View Controller life cycle - - (void)viewDidLoad { [super viewDidLoad]; // 1 tableData = [self getTableData]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //  ,      [_messageTextField becomeFirstResponder]; // 2 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedMessage) name:@"kC2CallPhoneReceivedMessage" object:nil]; } #pragma mark - UITableViewDataSource - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 3 return tableData.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 4 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.textLabel.text = ([tableData[indexPath.row][@"eventType"] isEqualToString:@"MessageIn"]) ? self.title : @""; cell.detailTextLabel.text = tableData[indexPath.row][@"text"]; return cell; } #pragma mark - Button methods - - (IBAction)sendTouched:(UIButton *)sender { // 5 [[NKChat sharedManager] sendMessage:_messageTextField.text toUser:@"c45645f71465dcff18e"]; [self addMessage:_messageTextField.text]; _messageTextField.text = @""; } #pragma mark - General Methods - - (void)addMessage:(NSString *)message { // 6 NSMutableArray *mTableData = [tableData mutableCopy]; [mTableData addObject:@{@"text":message, @"eventType":@"MessageOut"}]; tableData = mTableData; [_tableView reloadData]; } - (void)receivedMessage { // 7 tableData = [self getTableData]; [_tableView reloadData]; } - (NSArray *)getTableData { // 8 for (NSDictionary *chat in [NKChat sharedManager].chatHistory) if ([chat[@"contact"] isEqualToString:self.title]) return chat[@"messages"]; return nil; } @end
      
      





рдХреНрд░рдо рдореЗрдВ:



  1. рдЬреИрд╕реЗ рд╣реА рдирд┐рдпрдВрддреНрд░рдХ рдмреВрдЯ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рджреЗрддреЗ рд╣реИрдВ
  2. kC2CallPhoneReceivedMessage - рдпрд╣ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рдирд╛рдо рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЖрдпрд╛ рд╣реИ; рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ
  3. рд╣рдореЗрдВ рдЙрддрдиреА рд╣реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рддрдиреА рдЗрд╕ рдЪреИрдЯ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдХреБрд▓ рд╕рдВрджреЗрд╢ рд╣реИрдВ
  4. рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрд░реНрдХ рдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  5. рд╣рдо NKChat рд╕реЗ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ; рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдХ рдбреЗрдЯрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджреЗрд╢ рдХреЛ C2Call рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЪрд╛рд╣рд┐рдП; рднреЗрдЬрдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ
  6. рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ред рдореИрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВ
  7. рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
  8. рд╣рдо рд╕рд┐рд░реНрдл рдкреВрд░реЗ рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЬрд┐рд╕ рд╕рдВрдкрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЙрд╕рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ


рдпрд╣рд╛рдБ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ (рдмрдбрд╝рд╛ GIF):







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



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



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



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



рдпрджрд┐ рдЖрдкрдХреЛ рд▓реЗрдЦ рдореЗрдВ рдЯрд╛рдЗрдкреЛрд╕ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореЗрд░реЗ рд╣реЗрдмрд░рд╕реЗрдиреНрдЯ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВред



рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВред



All Articles