
рд╣реИрдмрд░рд╣рд╛рдм рдХреЗ рдкреНрдпрд╛рд░реЗ рдкрд╛рдардХреЛрдВ!
рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬрд▓реНрджреА рдФрд░ рд▓рдЧрднрдЧ рджрд░реНрдж рд░рд╣рд┐рдд рддрд░реАрдХреЗ рд╕реЗ iOS рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдмрдврд╝рд╛рдПрдВред рдореИрдВ рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрддрд╛ рд╣реВрдВ:
- рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛, рд╕рд░рд▓ рдпреВрдЖрдИ, рддреНрд╡рд░рд┐рдд рд╕рдВрджреЗрд╢ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА
- рд╣рдо рдПрдХ рд╕реБрдВрджрд░ рдпреВрдЖрдИ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╡реАрдбрд┐рдпреЛ рдФрд░ рдСрдбрд┐рдпреЛ рдХреЙрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдлрд╝реЛрдЯреЛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, 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
рдЖрдЗрдП рдЬрд╛рдиреЗ рдХреНрд░рдо рдореЗрдВ:
- рдорд╛рдирдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИред рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ - рдЬрд┐рд╕рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
- рдПрдХ рдПрдХреНрд╕реЗрд╕рд░ рд╡рд┐рдзрд┐ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рдореЗрдВ рдЪреИрдЯ рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рддреА рд╣реИред
- рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ред C2Call рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд▓реЙрдЧ рдЗрди рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рджреВрд╕рд░реА рдмрд╛рд░ рдЙрд╕реА рдбреЗрдЯрд╛ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рдирд┐: рд╢реБрд▓реНрдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗред рдЖрдк рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП C2Call рд╕реЗ рдПрдХ рдореВрд▓ рдкрдВрдЬреАрдХрд░рдг рд╡рд┐рдВрдбреЛ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рд▓реЙрдЧрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ред рд╕рд╕реНрддрд╛ рдФрд░ рд╣рдВрд╕рдореБрдЦред
- рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рднреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
- рдПрдХ рднрдпрд╛рдирдХ рдФрд░ рд░рд╛рдХреНрд╖рд╕реА рдореЗрдЬрд╝рдкреЛрд╢ рд╡рд┐рдзрд┐ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЪреИрдЯ рдЗрддрд┐рд╣рд╛рд╕ рд▓реМрдЯрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рд╕рднреА рдкрддреНрдерд░ рд╣реИрдВ рдЬреЛ рдЖрдк 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
рдХреНрд░рдо рдореЗрдВ:
- рдЬреИрд╕реЗ рд╣реА рдирд┐рдпрдВрддреНрд░рдХ рдмреВрдЯ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕реЗ рднрд░ рджреЗрддреЗ рд╣реИрдВ
- kC2CallPhoneReceivedMessage - рдпрд╣ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рдирд╛рдо рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдЖрдпрд╛ рд╣реИ; рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ
- рд╣рдореЗрдВ рдЙрддрдиреА рд╣реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рддрдиреА рдЗрд╕ рдЪреИрдЯ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдХреБрд▓ рд╕рдВрджреЗрд╢ рд╣реИрдВ
- рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдкрд░реНрдХ рдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╣рдо NKChat рд╕реЗ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ; рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдХ рдбреЗрдЯрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджреЗрд╢ рдХреЛ C2Call рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЪрд╛рд╣рд┐рдП; рднреЗрдЬрдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ
- рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ред рдореИрдВ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВ
- рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
- рд╣рдо рд╕рд┐рд░реНрдл рдкреВрд░реЗ рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЬрд┐рд╕ рд╕рдВрдкрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЙрд╕рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣рд╛рдБ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ (рдмрдбрд╝рд╛ GIF):

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