ããã©ããã®èªè ã®çãããããã«ã¡ã¯ïŒ
ãã®äžé£ã®èšäºã§ã¯ãiOSçšã®WhatsAppããã°ããç°¡åã«äœæããæ¹æ³ã説æããŸãã 䟿å®äžãèšäºã2ã€ã®éšåã«åããŠããŸãã
- ãããžã§ã¯ãã®äœæãã·ã³ãã«ãªUIãã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãžã®ãã€ã³ã
- çŸããUIãäœæãããããªãšãªãŒãã£ãªã®åŒã³åºããè¿œå ããåçãšããã¥ã¡ã³ãã転éããŸã
æ®å¿µãªããã4å人ã®ãŠãŒã¶ãŒãåéãã19人ã®Instagramã®ãµãŒãã¹ã販売ããæ¹æ³ã«é¢ããããã¥ã¢ã«ã¯ãæ¬æ£ã®ã©ããã§å€±ãããŸããã 誰ããèå³ããããªããç§ã¯åœŒãèŠã€ããããšããŸãã
ç«ã®äžã§èå³ãæã£ãŠãã ããã
ãããžã§ã¯ãäœæ
Xcodeãéããæ°ãããããžã§ã¯ããäœæããŸãã
ç§ãã¡ã¯ãã·ã³ã°ã«ãã¥ãŒã¢ããªã±ãŒã·ã§ã³ãåºç€ãšããŠåããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããŒã¿ãå ¥åããã次ãžããã¯ãªãã¯ããŸãã æãæ§ãããªã¬ã¬ãªã¢ãéžæããŸããã
ãããžã§ã¯ãã®æºåãã§ããŸããã
ããããããã¯äœã§ããïŒ ãã¡ã€ã«ãã°ã«ãŒãã«åå²ãããªããŠæãããããšã§ãããïŒ ãããä¿®æ£ããŸãããã
ããã¯è¯ãã§ãïŒ ç¬èªã®æ¹æ³ã§ãã¡ã€ã«ã䞊ã¹æ¿ããããšãã§ããŸããããã®ã¬ã€ãã§ã¯äžèšã®ã¢ãã«ã«åºå·ããŸãã ã¡ãªã¿ã«ãæ°ããã°ã«ãŒããäœæããããã®ããŒã®çµã¿åããã¯ãCommand + Alt + Nã§ãã
ã·ã³ãã«ãªUI
ãããŸã§ã®éãç§ã¯èªåã§æ°ããNKLoginViewControllerã¯ã©ã¹ãäœæãããããInterface Builderã§UIViewControllerãªããžã§ã¯ãã«ãã€ã³ãããããšãèš±å¯ããŸããã ãã®View Controllerã¯ããŠãŒã¶ãŒãæåã«ç®ã«ãããã®ã§ãã ããã¯è«ççã§ã-ç»é²ãªãã§ãã£ããã¯ã§ããŸããïŒ
åŒãç¶ã楜ãã¿ãªãããã¢ãŠãã¬ãããªã©ã®ããã¹ããã£ãŒã«ããšããã°ã€ã³ãã¿ã³ã®ã¢ã¯ã·ã§ã³ãNKLoginViewControllerã«ãã蟌ã¿ãŸããã IBãªããžã§ã¯ãã.mãã¡ã€ã«ã«ãã蟌ãã§ãå€éšããã¢ã¯ã»ã¹ã§ããªãããã«ããã®ãè¯ããšæããŸãã ããã«ãã³ãŒãããã©ã°ãã«åå²ãããŠãããšããæ°ã«å ¥ã£ãŠããŸãã
ã³ã³ãããŒã©ãŒã®ãã1ã€ïŒIBã®è¡šçŸãšæ°ããã¯ã©ã¹ã®äž¡æ¹ïŒãäœæããŸã-ãã£ããã®ãªã¹ãã§ãã æšæºã³ãŒã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; }
次ã«ãããã²ãŒã·ã§ã³ã«ã€ããŠèããŠã¿ãŸãããã ã¢ããªã±ãŒã·ã§ã³å šäœã1ã€ã®UINavigationControllerã«çµ±åãããç¶æ³ã«å¿ããŠã³ã³ãããŒã©ãŒãããã·ã¥ããã³å¶åŸ¡ããŸãã ã¢ããªã±ãŒã·ã§ã³ãUINavigationControllerã«çµ±åããŸãïŒ éæ³ã®æéãå§ããŸãããïŒ
ãã°ã€ã³ãã¥ãŒã³ã³ãããŒã©ãŒãããã£ãããªã¹ãããŒãã«ãã¥ãŒã³ã³ãããŒã©ãŒã«ã³ã³ãããŒã©ãŒãšã»ã°ãšã®ååãè¿œå ããŸãã ãSegueToChatListããšåŒã³ãŸãããã ããããã¢ããªã±ãŒã·ã§ã³ã®å€èŠ³ã§ãã
Login View Controllerã®ã³ãŒããå°ãèŠãŠã¿ãŸãããã ãŠãŒã¶ãŒã«ããŒããŒããåãå€ãæ©äŒãäžããŸãã ãããè¡ãã«ã¯ãã³ã³ãããŒã©ãŒãããã¹ããã£ãŒã«ãã®ããªã²ãŒãã«ããŸãã
ãŸããã³ã³ãããŒã©ãŒã³ãŒãèªäœã¯æ¬¡ã®ããã«ä¿®æ£ãããŸãã
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]; }
ãšããããããã°ã€ã³ã³ã³ãããŒã©ãŒäžã®ãã¹ãŠã®èŠçŽ ã転éããŸããããã¯ã·ã³ãã«ãªUIã§ãã ããŒããŒãã衚瀺ããããšãã«ã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãã€ã³ã¿ã©ã¯ãã£ãã«äžã«ç§»åããæ¹æ³ã«ã€ããŠã¯ã次ã®ããŒãã§èª¬æããŸãã
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã§ã«çªã£èŸŒãã§ããŸãïŒ
æåŸã®3çªç®ã®ã³ã³ãããŒã©ãŒãäœæããŸãã åã®ã³ã³ãããŒã©ãŒã®ã»ã«ãã¯ãªãã¯ããããšã§ãããã«å ¥ããŸãã ã³ã³ãããŒã©ãŒèªäœã¯ãããŒã¿ãœãŒã¹ãã³ã³ãããŒã©ãŒã«å²ãåœãŠãããŠãã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
ã¡ãã»ã³ãžã£ãŒçšã®ã·ã³ãã«ãªUIã®æºåãã§ããŸããã 楜ããéšåã«å°éãã-ã¢ããªã±ãŒã·ã§ã³ã®è©°ã蟌ã¿ïŒ
ã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãžã®ãªã³ã¯
ã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãšããŠãC2CallããããŸãã ãã¡ããããµãŒããŒåŽã®èšè¿°ã劚ãããã®ã¯ãããŸãããã24æé以äžãããå ŽåããããŸãã
ããªããããªããã°ãªããªãã®ã¯ãc2call.comã«ç»é²ãã100ãã«ã§ã¢ã«ãŠã³ããè³Œå ¥ããããšã§ãã æ®å¿µãªãããäœèšèªAPIã«ããç»é²ã¯ç¡æçã§ã¯æ©èœããŸããã ããããããã®èšäºãèªããšãã«äœããå€ããã§ãããã ããããæ¯æã®æ¯æãã®ä»£ããã«ãC2Callã¯ç§ãã100ãã«ãåŒãåºããç§ã®ããšãå¿ããŠããããã§ããã ãã以äžãéã¯ååŽãããŸããã§ããã 補åãè³Œå ¥ããããæ¯æã®ãµãã¹ã¯ãªãã·ã§ã³ã§éè©Šããããããšããå§ãããŸããã ç§ã¯ã¡ããã©å¹žéã ãšæããŸãã
ç»é²åŸãã¢ã«ãŠã³ããè³Œå ¥ãããµãŒãã¹ã«ã¢ããªã±ãŒã·ã§ã³ãç»é²ããŸã-ããã¯ããªãç°¡åãªã¿ã¹ã¯ã§ã-SDKãããŠã³ããŒãããŸãã ã¢ãŒã«ã€ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯æ¹æ³ã®äŸãããã€ããããŸãã 次ã®2ã€ã®ãªããžã§ã¯ããå¿ èŠã§ãã
ãããããããžã§ã¯ãã«è»¢éããŸãã
次ã®ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªããããžã§ã¯ãã«è¿œå ããŸãã
ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªã®æããããªã¹ã
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
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 / include / libxml2
OTHER_LDFLAGS = -lxml2 -lstdc ++
ARCHS = armv7
VALID_ARCHS = armv7
ããã§ã¯ãApp Delegateãå°ãå€æŽããŸãããã
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ã®èŠçŽ ããµãã¯ã©ã¹åããããŒã¿ã«ã€ããŠåœŒã«äŒããŸããã ãµãŒãã¹ã®ç®¡çããã«ã§ã¢ãã£ãªãšã€ãIDãšã·ãŒã¯ã¬ããã確èªã§ããŸãã
ãã¬ãŒã ã¯ãŒã¯ã®ã»ããã¢ãããå®äºããããããã䜿çšããŸãã
ãã£ããããžãã¯å šäœãã«ãã»ã«åãã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ã€ãããŸã-ããå¿ èŠãããŸããã
- å¿ èŠãªåœ¢åŒã§ãã£ããå±¥æŽã®é åãè¿ãã¢ã¯ã»ãµã¡ãœããã
- ç»é²ããã³ãã°ã€ã³ã®æ¹æ³ã C2Callæ©èœã¯ãåãããŒã¿ã§åããŠãã°ã€ã³ãããšãã«ãã°ã€ã³ããããšã§ãã åãããŒã¿ã§2åãã°ã€ã³ãããšãåã«ãã°ã€ã³ããŸãã æ®å¿µãªããããã®æ¹æ³ã¯ç¡æã®ãµãã¹ã¯ã©ã€ããŒã«ã¯å©çšã§ããŸããã C2Callãããã€ãã£ãç»é²ãŠã£ã³ããŠãè¿œå ããŠä¿åããããšã§ããã®ã¡ãœãããåé¿ã§ããŸãã
- ãã°ã¢ãŠãã®æ¹æ³ã å®ããŠéœæ°ãªã
- ã¡ãã»ãŒãžãéä¿¡ããæ¹æ³ãéåžžã«ç°¡åã§ãã
- ãã£ããã®å±¥æŽãç®çã®åœ¢åŒã§è¿ããã²ã©ããŠæªããããŒãã«ã¯ãã¹ã¡ãœããã C2Callã䜿çšããŠééã§ãããã¹ãŠã®ç³ã¯æ¬¡ã®ãšããã§ãã æåã«ãããŒã¿ã¯Core Dataã«ä¿åãããŸãã 第äºã«ãé£çµ¡å ã®ååã¯çµ¶ããç°ãªã£ãŠããŸã-ã©ã¡ããã®IDãæ¥ãŠã次ã«å§ãšåã 第äžã«ãä»ã®ãšãããã®æ¹æ³ãå¿ããŠãã ããã ãã®ãã¥ãŒããªã¢ã«ã§æ©èœããŸãã
ããŠããã¹ãŠã®æºåãæŽã£ãããã³ãŒãã®éæ³ã䜿ããŸãããïŒ
NKChatã®åæåããŸã è¡ã£ãŠããªãå Žåã¯ãNKAppDelegate.mã«è¿œå ããŸãã
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ã¯ã©ã¹ã®loginTouchedã¡ãœããããããã«å€æŽããŸãã 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ã®2ã€ã®ã¢ã«ãŠã³ãã䜿çšããŸãã ãããã®2ã€ã®é£çµ¡å ã«ã¡ãã»ãŒãžãéä¿¡ããæ©èœãäžæçã«ããŒãã³ãŒãããŸãã
NKChatListTableViewController.mãå°ãå€æŽããŠãããã2ã€ã®é£çµ¡å ã®ã¿ãéä¿¡ãããããã«ããŸãã
æŒããŠïŒ
#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ïŒïŒ
ãããã«
ãã®ã¬ã€ãã®æåã®éšåã®æåŸã«å°éããŠããã ãããããšãããããŸãã ããã«ã2ã3æ¥ã®ç©ºãæ¥ãçŸããã®ã§ã第2éšãæžããŸãã æåã®éšåã®ãœãŒã¹ã³ãŒãã¯ãã¡ãã§ãã
2çªç®ã®éšåã§ã¯ãUIã«é¢ããããã€ãã®ããªã±ãŒããªè³ªåã解決ããããã€ãã®C2Callãã°ïŒããšãã°ãã¡ãã»ãŒãžã®ããæåŸã®GIFã«è¡šç€ºããããã°ïŒããã€ãã¹ããã¢ããªã±ãŒã·ã§ã³ã«æ©èœãè¿œå ããããã€ãã®ç«ãå¹³ææã¡ããŸãã
ãã¥ãŒããªã¢ã«ã«ã€ããŠè³ªåãããå Žåã¯ãã³ã¡ã³ãã§æ°è»œã«è³ªåããŠãã ããããã¹ãŠãçãããŸãã
èšäºã«ã¿ã€ããã¹ã誀ããèŠã€ãã£ãå Žåã¯ãããã©ã»ã³ã¿ãŒã«ãé£çµ¡ãã ããã
ãããã