Compare View

switch
from
...
to
 
Commits (7)

Changes

Showing 36 changed files Side-by-side Diff

LifeLog/LifeLog.xcodeproj/project.pbxproj
... ... @@ -57,6 +57,11 @@
57 57 E9373E471F3596940059355A /* AutoTransLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = E9373E461F3596940059355A /* AutoTransLabel.m */; };
58 58 E9373E4A1F35AA180059355A /* HistoryObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E9373E491F35AA180059355A /* HistoryObject.m */; };
59 59 E9373E4D1F361A230059355A /* HistoryGraphObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E9373E4C1F361A230059355A /* HistoryGraphObject.m */; };
  60 + E9497FD51F46EC1100E6AF8D /* MemberObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E9497FD41F46EC1100E6AF8D /* MemberObject.m */; };
  61 + E95F4CED1F475C6A00D27E80 /* CreateGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E95F4CEB1F475C6A00D27E80 /* CreateGroupViewController.m */; };
  62 + E95F4CEE1F475C6A00D27E80 /* CreateGroupViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E95F4CEC1F475C6A00D27E80 /* CreateGroupViewController.xib */; };
  63 + E95F4CF31F48B39200D27E80 /* MyGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E95F4CF11F48B39200D27E80 /* MyGroupViewController.m */; };
  64 + E95F4CF41F48B39200D27E80 /* MyGroupViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E95F4CF21F48B39200D27E80 /* MyGroupViewController.xib */; };
60 65 E9682E2E1F39675A00FE05A2 /* RankingTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E9682E2C1F39675A00FE05A2 /* RankingTableViewCell.m */; };
61 66 E9682E2F1F39675A00FE05A2 /* RankingTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E9682E2D1F39675A00FE05A2 /* RankingTableViewCell.xib */; };
62 67 E968550A1F3C444900317CEF /* AutoTransButton.m in Sources */ = {isa = PBXBuildFile; fileRef = E96855091F3C444900317CEF /* AutoTransButton.m */; };
... ... @@ -181,6 +186,14 @@
181 186 E9373E491F35AA180059355A /* HistoryObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryObject.m; sourceTree = "<group>"; };
182 187 E9373E4B1F361A230059355A /* HistoryGraphObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryGraphObject.h; sourceTree = "<group>"; };
183 188 E9373E4C1F361A230059355A /* HistoryGraphObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryGraphObject.m; sourceTree = "<group>"; };
  189 + E9497FD31F46EC1100E6AF8D /* MemberObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemberObject.h; sourceTree = "<group>"; };
  190 + E9497FD41F46EC1100E6AF8D /* MemberObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MemberObject.m; sourceTree = "<group>"; };
  191 + E95F4CEA1F475C6A00D27E80 /* CreateGroupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CreateGroupViewController.h; sourceTree = "<group>"; };
  192 + E95F4CEB1F475C6A00D27E80 /* CreateGroupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CreateGroupViewController.m; sourceTree = "<group>"; };
  193 + E95F4CEC1F475C6A00D27E80 /* CreateGroupViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CreateGroupViewController.xib; sourceTree = "<group>"; };
  194 + E95F4CF01F48B39200D27E80 /* MyGroupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyGroupViewController.h; sourceTree = "<group>"; };
  195 + E95F4CF11F48B39200D27E80 /* MyGroupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyGroupViewController.m; sourceTree = "<group>"; };
  196 + E95F4CF21F48B39200D27E80 /* MyGroupViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MyGroupViewController.xib; sourceTree = "<group>"; };
184 197 E9682E2B1F39675A00FE05A2 /* RankingTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RankingTableViewCell.h; sourceTree = "<group>"; };
185 198 E9682E2C1F39675A00FE05A2 /* RankingTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RankingTableViewCell.m; sourceTree = "<group>"; };
186 199 E9682E2D1F39675A00FE05A2 /* RankingTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RankingTableViewCell.xib; sourceTree = "<group>"; };
... ... @@ -281,6 +294,8 @@
281 294 E9D909201F3D559D004CF99F /* TweetObject.m */,
282 295 E933E6721F3E0E4E002926F5 /* GroupObject.h */,
283 296 E933E6731F3E0E4E002926F5 /* GroupObject.m */,
  297 + E9497FD31F46EC1100E6AF8D /* MemberObject.h */,
  298 + E9497FD41F46EC1100E6AF8D /* MemberObject.m */,
284 299 );
285 300 name = Model;
286 301 sourceTree = "<group>";
... ... @@ -308,6 +323,7 @@
308 323 6E84E3981F27A703001EB88E /* LifeLogUITests */,
309 324 DE8269E957EA47CD771BAB33 /* Pods */,
310 325 020C1721B642EF36F31E1BB4 /* Frameworks */,
  326 + 783929CF869F5081762B3DCA /* Products */,
311 327 );
312 328 sourceTree = "<group>";
313 329 };
... ... @@ -430,7 +446,9 @@
430 446 6E84E3AC1F27A954001EB88E /* SNS */ = {
431 447 isa = PBXGroup;
432 448 children = (
433   - E933E6751F4050E6002926F5 /* GrouDetail */,
  449 + E95F4CEF1F48B37100D27E80 /* MyGroup */,
  450 + E95F4CE91F475C4B00D27E80 /* CreateGroup */,
  451 + E933E6751F4050E6002926F5 /* GroupDetail */,
434 452 E933E6671F3E0479002926F5 /* SeachGroup */,
435 453 6E84E3BC1F27A9B1001EB88E /* SNSViewController.h */,
436 454 6E84E3BD1F27A9B1001EB88E /* SNSViewController.m */,
... ... @@ -491,6 +509,13 @@
491 509 name = Common;
492 510 sourceTree = "<group>";
493 511 };
  512 + 783929CF869F5081762B3DCA /* Products */ = {
  513 + isa = PBXGroup;
  514 + children = (
  515 + );
  516 + name = Products;
  517 + sourceTree = "<group>";
  518 + };
494 519 9CA8AEE61F31BB1200C5FC74 /* ConfirmForgetPass */ = {
495 520 isa = PBXGroup;
496 521 children = (
... ... @@ -547,14 +572,14 @@
547 572 name = SeachGroup;
548 573 sourceTree = "<group>";
549 574 };
550   - E933E6751F4050E6002926F5 /* GrouDetail */ = {
  575 + E933E6751F4050E6002926F5 /* GroupDetail */ = {
551 576 isa = PBXGroup;
552 577 children = (
553 578 E933E6761F40513C002926F5 /* GroupDetailViewController.h */,
554 579 E933E6771F40513C002926F5 /* GroupDetailViewController.m */,
555 580 E933E6781F40513C002926F5 /* GroupDetailViewController.xib */,
556 581 );
557   - name = GrouDetail;
  582 + name = GroupDetail;
558 583 sourceTree = "<group>";
559 584 };
560 585 E9373E441F35966D0059355A /* AutoTranslateView */ = {
... ... @@ -568,6 +593,26 @@
568 593 name = AutoTranslateView;
569 594 sourceTree = "<group>";
570 595 };
  596 + E95F4CE91F475C4B00D27E80 /* CreateGroup */ = {
  597 + isa = PBXGroup;
  598 + children = (
  599 + E95F4CEA1F475C6A00D27E80 /* CreateGroupViewController.h */,
  600 + E95F4CEB1F475C6A00D27E80 /* CreateGroupViewController.m */,
  601 + E95F4CEC1F475C6A00D27E80 /* CreateGroupViewController.xib */,
  602 + );
  603 + name = CreateGroup;
  604 + sourceTree = "<group>";
  605 + };
  606 + E95F4CEF1F48B37100D27E80 /* MyGroup */ = {
  607 + isa = PBXGroup;
  608 + children = (
  609 + E95F4CF01F48B39200D27E80 /* MyGroupViewController.h */,
  610 + E95F4CF11F48B39200D27E80 /* MyGroupViewController.m */,
  611 + E95F4CF21F48B39200D27E80 /* MyGroupViewController.xib */,
  612 + );
  613 + name = MyGroup;
  614 + sourceTree = "<group>";
  615 + };
571 616 E99E13A71F336F0C00C78787 /* CustomView */ = {
572 617 isa = PBXGroup;
573 618 children = (
... ... @@ -684,7 +729,7 @@
684 729 Base,
685 730 );
686 731 mainGroup = 6E84E3681F27A700001EB88E;
687   - productRefGroup = 6E84E3721F27A700001EB88E /* Products */;
  732 + productRefGroup = 783929CF869F5081762B3DCA /* Products */;
688 733 projectDirPath = "";
689 734 projectRoot = "";
690 735 targets = (
... ... @@ -701,6 +746,7 @@
701 746 buildActionMask = 2147483647;
702 747 files = (
703 748 9CBDA1001F2F03810055DED1 /* RegisterViewController.xib in Resources */,
  749 + E95F4CEE1F475C6A00D27E80 /* CreateGroupViewController.xib in Resources */,
704 750 6E18CED41F2E39DB0029891F /* LoginViewController.xib in Resources */,
705 751 E99E13AD1F336F4500C78787 /* CollectionView.xib in Resources */,
706 752 6E84E3BB1F27A9A0001EB88E /* RankingViewController.xib in Resources */,
... ... @@ -715,6 +761,7 @@
715 761 6EF1630A1F29069300DA306C /* Localizable.strings in Resources */,
716 762 6E84E3B11F27A975001EB88E /* HomeViewController.xib in Resources */,
717 763 6E84E3B61F27A98B001EB88E /* HistoryViewController.xib in Resources */,
  764 + E95F4CF41F48B39200D27E80 /* MyGroupViewController.xib in Resources */,
718 765 E933E66C1F3E04A6002926F5 /* SearchGroupViewController.xib in Resources */,
719 766 E96855121F3C5D9A00317CEF /* SNSRecentTopicTableViewCell.xib in Resources */,
720 767 E933E67A1F40513C002926F5 /* GroupDetailViewController.xib in Resources */,
... ... @@ -814,6 +861,7 @@
814 861 6EDC8BF41F2C68D700765ACC /* CMMotionActivityExtra.m in Sources */,
815 862 E933E6791F40513C002926F5 /* GroupDetailViewController.m in Sources */,
816 863 6EA4AF311F40BB7A00F52CFE /* StepObject.m in Sources */,
  864 + E95F4CED1F475C6A00D27E80 /* CreateGroupViewController.m in Sources */,
817 865 9CBDA0FF1F2F03810055DED1 /* RegisterViewController.m in Sources */,
818 866 E9373E4A1F35AA180059355A /* HistoryObject.m in Sources */,
819 867 9CA8AEEA1F31BB4600C5FC74 /* ConfirmForgetPassViewController.m in Sources */,
... ... @@ -823,12 +871,14 @@
823 871 6E84E3C51F27ACAE001EB88E /* MapViewController.m in Sources */,
824 872 6E18CEDC1F2E40F50029891F /* User.m in Sources */,
825 873 6ECC40711F2A5FEB00AAEB97 /* NSDate+helper.m in Sources */,
  874 + E9497FD51F46EC1100E6AF8D /* MemberObject.m in Sources */,
826 875 6E18CED31F2E39DB0029891F /* LoginViewController.m in Sources */,
827 876 6EA4AF331F40BB7A00F52CFE /* TopObject.m in Sources */,
828 877 E9D909241F3D6E8C004CF99F /* BaseTableViewController.m in Sources */,
829 878 6E84E3761F27A701001EB88E /* main.m in Sources */,
830 879 E933E6701F3E09B6002926F5 /* SearchGroupTableViewCell.m in Sources */,
831 880 6E84E3B51F27A98B001EB88E /* HistoryViewController.m in Sources */,
  881 + E95F4CF31F48B39200D27E80 /* MyGroupViewController.m in Sources */,
832 882 E9373E4D1F361A230059355A /* HistoryGraphObject.m in Sources */,
833 883 E933E66B1F3E04A6002926F5 /* SearchGroupViewController.m in Sources */,
834 884 6E84E3BF1F27A9B1001EB88E /* SNSViewController.m in Sources */,
LifeLog/LifeLog/Assets.xcassets/History/arrow_down.imageset/Contents.json
... ... @@ -0,0 +1,21 @@
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "scale" : "1x"
  6 + },
  7 + {
  8 + "idiom" : "universal",
  9 + "filename" : "arrow_down.png",
  10 + "scale" : "2x"
  11 + },
  12 + {
  13 + "idiom" : "universal",
  14 + "scale" : "3x"
  15 + }
  16 + ],
  17 + "info" : {
  18 + "version" : 1,
  19 + "author" : "xcode"
  20 + }
  21 +}
0 22 \ No newline at end of file
LifeLog/LifeLog/Assets.xcassets/History/arrow_down.imageset/arrow_down.png

527 Bytes

LifeLog/LifeLog/BaseTableViewController.m
... ... @@ -61,6 +61,9 @@
61 61 }
62 62 if(error == nil) {
63 63 if(array.count != 0) {
  64 + if(_curPage == 1) {
  65 + [_curDataList removeAllObjects];
  66 + }
64 67 [_curDataList addObjectsFromArray:array];
65 68 dispatch_async(dispatch_get_main_queue(), ^{
66 69 [weakSelf.tableBase reloadData];
LifeLog/LifeLog/CreateGroupViewController.h
... ... @@ -0,0 +1,36 @@
  1 +//
  2 +// CreateGroupViewController.h
  3 +// LifeLog
  4 +//
  5 +// Created by nvtu on 8/19/17.
  6 +// Copyright © 2017 PhongNV. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +#import "BaseViewController.h"
  11 +#import "AutoTransButton.h"
  12 +#import "Utilities.h"
  13 +#import "Entities.h"
  14 +
  15 +@interface CreateGroupViewController : BaseViewController<UITextFieldDelegate, UITextViewDelegate>
  16 +
  17 +@property (weak, nonatomic) IBOutlet UITextField *textName;
  18 +@property (weak, nonatomic) IBOutlet UITextField *textGoalWalk;
  19 +@property (weak, nonatomic) IBOutlet UITextField *textGoalRun;
  20 +@property (weak, nonatomic) IBOutlet UITextField *textGoalBike;
  21 +
  22 +@property (weak, nonatomic) IBOutlet UITextView *textGoal;
  23 +
  24 +@property (weak, nonatomic) IBOutlet UISwitch *switchWalk;
  25 +@property (weak, nonatomic) IBOutlet UISwitch *switchBike;
  26 +@property (weak, nonatomic) IBOutlet UISwitch *switchRun;
  27 +@property (weak, nonatomic) IBOutlet UISwitch *switchStep;
  28 +@property (weak, nonatomic) IBOutlet UISwitch *switchGym;
  29 +@property (weak, nonatomic) IBOutlet UISwitch *switchBegin;
  30 +
  31 +@property (copy) void (^createGroupSuccess)(GroupObject * group);
  32 +
  33 +- (IBAction)clickBack:(UIButton *)sender;
  34 +- (IBAction)clickCreateGroup:(AutoTransButton *)sender;
  35 +
  36 +@end
LifeLog/LifeLog/CreateGroupViewController.m
... ... @@ -0,0 +1,116 @@
  1 +//
  2 +// CreateGroupViewController.m
  3 +// LifeLog
  4 +//
  5 +// Created by nvtu on 8/19/17.
  6 +// Copyright © 2017 PhongNV. All rights reserved.
  7 +//
  8 +
  9 +#import "CreateGroupViewController.h"
  10 +#import "ServerAPI.h"
  11 +
  12 +@interface CreateGroupViewController ()
  13 +
  14 +@end
  15 +
  16 +@implementation CreateGroupViewController
  17 +
  18 +- (void)viewDidLoad {
  19 + [super viewDidLoad];
  20 + // Do any additional setup after loading the view from its nib.
  21 +}
  22 +
  23 +- (void)didReceiveMemoryWarning {
  24 + [super didReceiveMemoryWarning];
  25 + // Dispose of any resources that can be recreated.
  26 +}
  27 +
  28 +#pragma mark IBAction
  29 +
  30 +- (IBAction)clickBack:(UIButton *)sender {
  31 + [self.navigationController popViewControllerAnimated:true];
  32 +}
  33 +
  34 +- (IBAction)clickCreateGroup:(AutoTransButton *)sender {
  35 + NSString *name = self.textName.text;
  36 + NSString *goal = self.textGoal.text;
  37 + if(name.length == 0) {
  38 + [Utilities showErrorMessage:@"Fill name of group!" withViewController:self];
  39 + return;
  40 + }
  41 + else if(name.length >= 255) {
  42 + [Utilities showErrorMessage:@"Name of group is too long!" withViewController:self];
  43 + return;
  44 + }
  45 + else if(goal.length == 0) {
  46 + [Utilities showErrorMessage:@"Fill information for goal of group" withViewController:self];
  47 + return;
  48 + }
  49 + if(self.switchWalk.on && [self.textGoalWalk.text intValue] == 0) {
  50 + [Utilities showErrorMessage:@"Add goal for walk mode" withViewController:self];
  51 + return;
  52 + }
  53 + if(self.switchBike.on && [self.textGoalBike.text intValue] == 0) {
  54 + [Utilities showErrorMessage:@"Add goal for bike mode" withViewController:self];
  55 + return;
  56 + }
  57 + if(self.switchRun.on && [self.textGoalRun.text intValue] == 0) {
  58 + [Utilities showErrorMessage:@"Add goal for run mode" withViewController:self];
  59 + return;
  60 + }
  61 + GroupObject *object = [[GroupObject alloc] init];
  62 + object.name = name;
  63 + object.goal = goal;
  64 + object.walkMode = self.switchWalk.on;
  65 + object.runMode = self.switchRun.on;
  66 + object.bikeMode = self.switchBike.on;
  67 + object.stepMode = self.switchStep.on;
  68 + object.gymMode = self.switchGym.on;
  69 + object.beginMode = self.switchBegin.on;
  70 + object.walkGoal = [self.textGoalWalk.text intValue];
  71 + object.bikeGoal = [self.textGoalBike.text intValue];
  72 + object.runGoal = [self.textGoalRun.text intValue];
  73 +
  74 + NSLog(@"%@", object.name);
  75 + NSLog(@"%@", object.goal);
  76 + NSLog(@"%d", object.walkGoal);
  77 + NSLog(@"%d", object.bikeGoal);
  78 + NSLog(@"%d", object.runGoal);
  79 + NSLog(@"%d", object.walkMode);
  80 + NSLog(@"%d", object.runMode);
  81 + NSLog(@"%d", object.bikeMode);
  82 + NSLog(@"%d", object.stepMode);
  83 + NSLog(@"%d", object.gymMode);
  84 + NSLog(@"%d", object.beginMode);
  85 +
  86 + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
  87 + MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
  88 + [[ServerAPI server] requestCreateGroup:token withGroup:object CompletionHandler:^(GroupObject * group, NSError * error) {
  89 + CreateGroupViewController __weak *weakSelf = self;
  90 + if(error == nil) {
  91 + dispatch_async(dispatch_get_main_queue(), ^{
  92 + if(weakSelf.createGroupSuccess != nil) {
  93 + [hudView hideAnimated:true];
  94 + [weakSelf clickBack:nil];
  95 + weakSelf.createGroupSuccess(object);
  96 + }
  97 + });
  98 + }
  99 + else {
  100 + dispatch_async(dispatch_get_main_queue(), ^{
  101 + [hudView hideAnimated:true];
  102 + NSString *message = [error.userInfo objectForKey:@"message"];
  103 + [Utilities showErrorMessage:message withViewController:weakSelf];
  104 + });
  105 + }
  106 + }];
  107 +}
  108 +
  109 +#pragma mark UITextView Delegate
  110 +
  111 +-(BOOL) textFieldShouldReturn:(UITextField *)textField {
  112 + [self.view endEditing:true];
  113 + return true;
  114 +}
  115 +
  116 +@end
LifeLog/LifeLog/CreateGroupViewController.xib
... ... @@ -0,0 +1,601 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12118" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
  3 + <device id="retina4_7" orientation="portrait">
  4 + <adaptation id="fullscreen"/>
  5 + </device>
  6 + <dependencies>
  7 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12086"/>
  8 + <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
  9 + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
  10 + </dependencies>
  11 + <objects>
  12 + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="CreateGroupViewController">
  13 + <connections>
  14 + <outlet property="switchBegin" destination="e63-8i-6aa" id="bbT-m6-3CV"/>
  15 + <outlet property="switchBike" destination="fGW-Vw-PwQ" id="ncx-kP-qdd"/>
  16 + <outlet property="switchGym" destination="Yga-UQ-xoU" id="rIN-kO-wmO"/>
  17 + <outlet property="switchRun" destination="2gX-B2-tkR" id="yak-gV-Cas"/>
  18 + <outlet property="switchStep" destination="RoR-w7-dNT" id="19b-K3-qAu"/>
  19 + <outlet property="switchWalk" destination="3xD-aH-JHl" id="OZ9-l7-Rww"/>
  20 + <outlet property="textGoal" destination="hWb-vU-yVd" id="dp0-yK-P60"/>
  21 + <outlet property="textGoalBike" destination="eOi-eo-GYn" id="qfW-ns-tsM"/>
  22 + <outlet property="textGoalRun" destination="3aE-uP-KLS" id="WAE-tl-O94"/>
  23 + <outlet property="textGoalWalk" destination="4JZ-J2-3D9" id="yHV-mB-rcn"/>
  24 + <outlet property="textName" destination="pXO-K0-vne" id="ePQ-35-RLr"/>
  25 + <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
  26 + </connections>
  27 + </placeholder>
  28 + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
  29 + <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
  30 + <rect key="frame" x="0.0" y="0.0" width="320" height="626"/>
  31 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
  32 + <subviews>
  33 + <scrollView multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aKu-bd-xMP" customClass="TPKeyboardAvoidingScrollView">
  34 + <rect key="frame" x="0.0" y="46" width="320" height="580"/>
  35 + <subviews>
  36 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9w1-87-U1W">
  37 + <rect key="frame" x="0.0" y="0.0" width="320" height="580"/>
  38 + <subviews>
  39 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="名称" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZtU-mt-3Ov" customClass="AutoTransLabel">
  40 + <rect key="frame" x="8" y="10" width="70" height="30"/>
  41 + <constraints>
  42 + <constraint firstAttribute="width" constant="70" id="Zvx-V3-7AW"/>
  43 + <constraint firstAttribute="height" constant="30" id="nok-hA-mW9"/>
  44 + </constraints>
  45 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  46 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  47 + <nil key="highlightedColor"/>
  48 + <userDefinedRuntimeAttributes>
  49 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.name"/>
  50 + </userDefinedRuntimeAttributes>
  51 + </label>
  52 + <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="pXO-K0-vne">
  53 + <rect key="frame" x="88" y="10" width="222" height="30"/>
  54 + <constraints>
  55 + <constraint firstAttribute="height" constant="30" id="YJe-TW-hvA"/>
  56 + </constraints>
  57 + <nil key="textColor"/>
  58 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  59 + <textInputTraits key="textInputTraits"/>
  60 + <connections>
  61 + <outlet property="delegate" destination="-1" id="3NL-Ya-JuM"/>
  62 + </connections>
  63 + </textField>
  64 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ONn-27-HqB">
  65 + <rect key="frame" x="10" y="50" width="140" height="120"/>
  66 + <subviews>
  67 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="S2z-DI-pIE">
  68 + <rect key="frame" x="0.0" y="0.0" width="140" height="40"/>
  69 + <subviews>
  70 + <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3xD-aH-JHl">
  71 + <rect key="frame" x="85" y="4" width="51" height="31"/>
  72 + <constraints>
  73 + <constraint firstAttribute="width" secondItem="3xD-aH-JHl" secondAttribute="height" multiplier="49:31" id="7LJ-H5-oQR"/>
  74 + </constraints>
  75 + <color key="onTintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  76 + </switch>
  77 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="WALK" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yFv-kp-ag8" customClass="AutoTransLabel">
  78 + <rect key="frame" x="6" y="10.5" width="47.5" height="20.5"/>
  79 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  80 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  81 + <nil key="highlightedColor"/>
  82 + <userDefinedRuntimeAttributes>
  83 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.walk"/>
  84 + </userDefinedRuntimeAttributes>
  85 + </label>
  86 + </subviews>
  87 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  88 + <constraints>
  89 + <constraint firstAttribute="trailing" secondItem="3xD-aH-JHl" secondAttribute="trailing" constant="6" id="KNe-Rx-lun"/>
  90 + <constraint firstAttribute="height" constant="40" id="akz-T7-d2v"/>
  91 + <constraint firstItem="3xD-aH-JHl" firstAttribute="centerY" secondItem="S2z-DI-pIE" secondAttribute="centerY" id="oRy-OM-Om1"/>
  92 + <constraint firstItem="yFv-kp-ag8" firstAttribute="leading" secondItem="S2z-DI-pIE" secondAttribute="leading" constant="6" id="prt-UF-Ori"/>
  93 + <constraint firstItem="yFv-kp-ag8" firstAttribute="centerY" secondItem="S2z-DI-pIE" secondAttribute="centerY" id="xEl-Rl-8C1"/>
  94 + </constraints>
  95 + </view>
  96 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dVh-y2-XTr">
  97 + <rect key="frame" x="0.0" y="40" width="140" height="40"/>
  98 + <subviews>
  99 + <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2gX-B2-tkR">
  100 + <rect key="frame" x="85" y="4" width="51" height="31"/>
  101 + <constraints>
  102 + <constraint firstAttribute="width" secondItem="2gX-B2-tkR" secondAttribute="height" multiplier="49:31" id="pBG-Mw-aNK"/>
  103 + </constraints>
  104 + <color key="onTintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  105 + </switch>
  106 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="RUN" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="r9v-yX-mx8" customClass="AutoTransLabel">
  107 + <rect key="frame" x="6" y="10.5" width="36" height="20.5"/>
  108 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  109 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  110 + <nil key="highlightedColor"/>
  111 + <userDefinedRuntimeAttributes>
  112 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.run"/>
  113 + </userDefinedRuntimeAttributes>
  114 + </label>
  115 + </subviews>
  116 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  117 + <constraints>
  118 + <constraint firstItem="2gX-B2-tkR" firstAttribute="centerY" secondItem="dVh-y2-XTr" secondAttribute="centerY" id="bNR-wC-PQG"/>
  119 + <constraint firstItem="r9v-yX-mx8" firstAttribute="leading" secondItem="dVh-y2-XTr" secondAttribute="leading" constant="6" id="iHM-Q7-Z1Z"/>
  120 + <constraint firstAttribute="height" constant="40" id="s8W-Ak-VrH"/>
  121 + <constraint firstAttribute="trailing" secondItem="2gX-B2-tkR" secondAttribute="trailing" constant="6" id="usV-BG-oqp"/>
  122 + <constraint firstItem="r9v-yX-mx8" firstAttribute="centerY" secondItem="dVh-y2-XTr" secondAttribute="centerY" id="yZW-Wk-raQ"/>
  123 + </constraints>
  124 + </view>
  125 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7PQ-zz-N0X">
  126 + <rect key="frame" x="0.0" y="80" width="140" height="40"/>
  127 + <subviews>
  128 + <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Yga-UQ-xoU">
  129 + <rect key="frame" x="85" y="4" width="51" height="31"/>
  130 + <constraints>
  131 + <constraint firstAttribute="width" secondItem="Yga-UQ-xoU" secondAttribute="height" multiplier="49:31" id="laB-Zs-gOj"/>
  132 + </constraints>
  133 + <color key="onTintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  134 + </switch>
  135 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ジム" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EFD-Ys-PqS" customClass="AutoTransLabel">
  136 + <rect key="frame" x="6" y="10.5" width="35" height="20.5"/>
  137 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  138 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  139 + <nil key="highlightedColor"/>
  140 + <userDefinedRuntimeAttributes>
  141 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.gym"/>
  142 + </userDefinedRuntimeAttributes>
  143 + </label>
  144 + </subviews>
  145 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  146 + <constraints>
  147 + <constraint firstItem="EFD-Ys-PqS" firstAttribute="centerY" secondItem="7PQ-zz-N0X" secondAttribute="centerY" id="Ein-vC-mpy"/>
  148 + <constraint firstAttribute="height" constant="40" id="aKm-hG-Hyh"/>
  149 + <constraint firstAttribute="trailing" secondItem="Yga-UQ-xoU" secondAttribute="trailing" constant="6" id="cfd-4G-1NF"/>
  150 + <constraint firstItem="EFD-Ys-PqS" firstAttribute="leading" secondItem="7PQ-zz-N0X" secondAttribute="leading" constant="6" id="ojT-rz-8oC"/>
  151 + <constraint firstItem="Yga-UQ-xoU" firstAttribute="centerY" secondItem="7PQ-zz-N0X" secondAttribute="centerY" id="xYy-kb-5Sk"/>
  152 + </constraints>
  153 + </view>
  154 + </subviews>
  155 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  156 + <constraints>
  157 + <constraint firstItem="dVh-y2-XTr" firstAttribute="top" secondItem="S2z-DI-pIE" secondAttribute="bottom" id="2LH-28-ssn"/>
  158 + <constraint firstItem="7PQ-zz-N0X" firstAttribute="leading" secondItem="ONn-27-HqB" secondAttribute="leading" id="6md-Y8-lIk"/>
  159 + <constraint firstAttribute="height" constant="120" id="7Tb-oJ-5eC"/>
  160 + <constraint firstItem="7PQ-zz-N0X" firstAttribute="top" secondItem="dVh-y2-XTr" secondAttribute="bottom" id="Fsa-Ai-cKQ"/>
  161 + <constraint firstAttribute="trailing" secondItem="S2z-DI-pIE" secondAttribute="trailing" id="OV6-wK-IJj"/>
  162 + <constraint firstItem="dVh-y2-XTr" firstAttribute="leading" secondItem="ONn-27-HqB" secondAttribute="leading" id="TFE-bH-HwH"/>
  163 + <constraint firstAttribute="trailing" secondItem="dVh-y2-XTr" secondAttribute="trailing" id="Vul-EM-V8H"/>
  164 + <constraint firstItem="S2z-DI-pIE" firstAttribute="top" secondItem="ONn-27-HqB" secondAttribute="top" id="Yf4-Rz-E4g"/>
  165 + <constraint firstAttribute="trailing" secondItem="7PQ-zz-N0X" secondAttribute="trailing" id="hLr-NV-hyv"/>
  166 + <constraint firstItem="S2z-DI-pIE" firstAttribute="leading" secondItem="ONn-27-HqB" secondAttribute="leading" id="zMY-Vd-Ge9"/>
  167 + </constraints>
  168 + </view>
  169 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Kpa-HJ-7cE">
  170 + <rect key="frame" x="170" y="50" width="140" height="120"/>
  171 + <subviews>
  172 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ALk-sL-SXG">
  173 + <rect key="frame" x="0.0" y="0.0" width="140" height="40"/>
  174 + <subviews>
  175 + <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fGW-Vw-PwQ">
  176 + <rect key="frame" x="85" y="4" width="51" height="31"/>
  177 + <constraints>
  178 + <constraint firstAttribute="width" secondItem="fGW-Vw-PwQ" secondAttribute="height" multiplier="49:31" id="qd5-Cg-6pG"/>
  179 + </constraints>
  180 + <color key="onTintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  181 + </switch>
  182 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="BIKE" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WfE-YM-vVU" customClass="AutoTransLabel">
  183 + <rect key="frame" x="6" y="10.5" width="36.5" height="20.5"/>
  184 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  185 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  186 + <nil key="highlightedColor"/>
  187 + <userDefinedRuntimeAttributes>
  188 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.bike"/>
  189 + </userDefinedRuntimeAttributes>
  190 + </label>
  191 + </subviews>
  192 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  193 + <constraints>
  194 + <constraint firstItem="WfE-YM-vVU" firstAttribute="leading" secondItem="ALk-sL-SXG" secondAttribute="leading" constant="6" id="7xm-U8-L7U"/>
  195 + <constraint firstAttribute="height" constant="40" id="L4u-uj-rHa"/>
  196 + <constraint firstItem="fGW-Vw-PwQ" firstAttribute="centerY" secondItem="ALk-sL-SXG" secondAttribute="centerY" id="PBA-tv-gec"/>
  197 + <constraint firstAttribute="trailing" secondItem="fGW-Vw-PwQ" secondAttribute="trailing" constant="6" id="bHc-Ih-6ar"/>
  198 + <constraint firstItem="WfE-YM-vVU" firstAttribute="centerY" secondItem="ALk-sL-SXG" secondAttribute="centerY" id="te7-Im-Oqh"/>
  199 + </constraints>
  200 + </view>
  201 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4Az-6N-8u4">
  202 + <rect key="frame" x="0.0" y="40" width="140" height="40"/>
  203 + <subviews>
  204 + <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RoR-w7-dNT">
  205 + <rect key="frame" x="85" y="4" width="51" height="31"/>
  206 + <constraints>
  207 + <constraint firstAttribute="width" secondItem="RoR-w7-dNT" secondAttribute="height" multiplier="49:31" id="YUz-Eh-EmZ"/>
  208 + </constraints>
  209 + <color key="onTintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  210 + </switch>
  211 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="STEP" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZyO-6K-2gA" customClass="AutoTransLabel">
  212 + <rect key="frame" x="6" y="10.5" width="42" height="20.5"/>
  213 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  214 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  215 + <nil key="highlightedColor"/>
  216 + <userDefinedRuntimeAttributes>
  217 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.step"/>
  218 + </userDefinedRuntimeAttributes>
  219 + </label>
  220 + </subviews>
  221 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  222 + <constraints>
  223 + <constraint firstAttribute="trailing" secondItem="RoR-w7-dNT" secondAttribute="trailing" constant="6" id="Cc4-W7-Qc8"/>
  224 + <constraint firstItem="ZyO-6K-2gA" firstAttribute="leading" secondItem="4Az-6N-8u4" secondAttribute="leading" constant="6" id="ER7-Bx-w9j"/>
  225 + <constraint firstAttribute="height" constant="40" id="Kcy-ij-IsH"/>
  226 + <constraint firstItem="RoR-w7-dNT" firstAttribute="centerY" secondItem="4Az-6N-8u4" secondAttribute="centerY" id="O1R-k3-iBZ"/>
  227 + <constraint firstItem="ZyO-6K-2gA" firstAttribute="centerY" secondItem="4Az-6N-8u4" secondAttribute="centerY" id="fWH-tG-gSV"/>
  228 + </constraints>
  229 + </view>
  230 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ORZ-El-owx">
  231 + <rect key="frame" x="0.0" y="80" width="140" height="40"/>
  232 + <subviews>
  233 + <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="e63-8i-6aa">
  234 + <rect key="frame" x="85" y="4" width="51" height="31"/>
  235 + <constraints>
  236 + <constraint firstAttribute="width" secondItem="e63-8i-6aa" secondAttribute="height" multiplier="49:31" id="TTd-tM-PrG"/>
  237 + </constraints>
  238 + <color key="onTintColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  239 + </switch>
  240 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="初心者" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RfO-1U-s4W" customClass="AutoTransLabel">
  241 + <rect key="frame" x="6" y="10.5" width="52" height="20.5"/>
  242 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  243 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  244 + <nil key="highlightedColor"/>
  245 + <userDefinedRuntimeAttributes>
  246 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.begin"/>
  247 + </userDefinedRuntimeAttributes>
  248 + </label>
  249 + </subviews>
  250 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  251 + <constraints>
  252 + <constraint firstItem="RfO-1U-s4W" firstAttribute="leading" secondItem="ORZ-El-owx" secondAttribute="leading" constant="6" id="5Vq-B2-215"/>
  253 + <constraint firstAttribute="trailing" secondItem="e63-8i-6aa" secondAttribute="trailing" constant="6" id="NUX-0H-z8v"/>
  254 + <constraint firstAttribute="height" constant="40" id="PdI-3J-BTC"/>
  255 + <constraint firstItem="e63-8i-6aa" firstAttribute="centerY" secondItem="ORZ-El-owx" secondAttribute="centerY" id="Vxw-Vk-POY"/>
  256 + <constraint firstItem="RfO-1U-s4W" firstAttribute="centerY" secondItem="ORZ-El-owx" secondAttribute="centerY" id="tX1-Qb-pKG"/>
  257 + </constraints>
  258 + </view>
  259 + </subviews>
  260 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  261 + <constraints>
  262 + <constraint firstAttribute="height" constant="120" id="1Z3-Ap-Qv1"/>
  263 + <constraint firstAttribute="trailing" secondItem="ALk-sL-SXG" secondAttribute="trailing" id="2DO-V0-pH1"/>
  264 + <constraint firstItem="ORZ-El-owx" firstAttribute="top" secondItem="4Az-6N-8u4" secondAttribute="bottom" id="9ap-NH-2HO"/>
  265 + <constraint firstItem="ALk-sL-SXG" firstAttribute="top" secondItem="Kpa-HJ-7cE" secondAttribute="top" id="Lc0-Xq-rka"/>
  266 + <constraint firstItem="4Az-6N-8u4" firstAttribute="leading" secondItem="Kpa-HJ-7cE" secondAttribute="leading" id="PVG-jU-N5c"/>
  267 + <constraint firstAttribute="trailing" secondItem="ORZ-El-owx" secondAttribute="trailing" id="WYz-Kv-H08"/>
  268 + <constraint firstItem="ORZ-El-owx" firstAttribute="leading" secondItem="Kpa-HJ-7cE" secondAttribute="leading" id="a7E-Je-SkO"/>
  269 + <constraint firstAttribute="bottom" secondItem="ORZ-El-owx" secondAttribute="bottom" id="dr5-Tk-AAg"/>
  270 + <constraint firstAttribute="trailing" secondItem="4Az-6N-8u4" secondAttribute="trailing" id="wOX-wa-25X"/>
  271 + <constraint firstItem="4Az-6N-8u4" firstAttribute="top" secondItem="ALk-sL-SXG" secondAttribute="bottom" id="xgc-3W-TS2"/>
  272 + <constraint firstItem="ALk-sL-SXG" firstAttribute="leading" secondItem="Kpa-HJ-7cE" secondAttribute="leading" id="yrE-eZ-Vg4"/>
  273 + </constraints>
  274 + </view>
  275 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="目標" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KTY-Ed-NJL" customClass="AutoTransLabel">
  276 + <rect key="frame" x="10" y="178" width="70" height="30"/>
  277 + <constraints>
  278 + <constraint firstAttribute="width" constant="70" id="Zlu-jK-x6p"/>
  279 + <constraint firstAttribute="height" constant="30" id="tVk-5e-QAY"/>
  280 + </constraints>
  281 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  282 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  283 + <nil key="highlightedColor"/>
  284 + <userDefinedRuntimeAttributes>
  285 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.goal"/>
  286 + </userDefinedRuntimeAttributes>
  287 + </label>
  288 + <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="hWb-vU-yVd">
  289 + <rect key="frame" x="88" y="178" width="222" height="120"/>
  290 + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  291 + <constraints>
  292 + <constraint firstAttribute="height" constant="120" id="iYo-mA-ZGR"/>
  293 + </constraints>
  294 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  295 + <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
  296 + <userDefinedRuntimeAttributes>
  297 + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
  298 + <integer key="value" value="10"/>
  299 + </userDefinedRuntimeAttribute>
  300 + </userDefinedRuntimeAttributes>
  301 + <connections>
  302 + <outlet property="delegate" destination="-1" id="fVh-oh-7St"/>
  303 + </connections>
  304 + </textView>
  305 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="マップ" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qdi-Na-zsj" customClass="AutoTransLabel">
  306 + <rect key="frame" x="10" y="313" width="70" height="30"/>
  307 + <constraints>
  308 + <constraint firstAttribute="height" constant="30" id="Ptf-0N-ewh"/>
  309 + <constraint firstAttribute="width" constant="70" id="mT3-FA-eev"/>
  310 + </constraints>
  311 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  312 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  313 + <nil key="highlightedColor"/>
  314 + <userDefinedRuntimeAttributes>
  315 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.map"/>
  316 + </userDefinedRuntimeAttributes>
  317 + </label>
  318 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1日目標" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qfU-7x-uss" customClass="AutoTransLabel">
  319 + <rect key="frame" x="10" y="353" width="300" height="30"/>
  320 + <constraints>
  321 + <constraint firstAttribute="height" constant="30" id="9dB-8p-Wdv"/>
  322 + </constraints>
  323 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  324 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  325 + <nil key="highlightedColor"/>
  326 + <userDefinedRuntimeAttributes>
  327 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.goal1day"/>
  328 + </userDefinedRuntimeAttributes>
  329 + </label>
  330 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="KEy-T1-mdK" customClass="AutoTransButton">
  331 + <rect key="frame" x="88" y="313" width="110" height="30"/>
  332 + <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
  333 + <constraints>
  334 + <constraint firstAttribute="height" constant="30" id="MWc-Aj-2JZ"/>
  335 + <constraint firstAttribute="width" constant="110" id="V16-pC-FRv"/>
  336 + </constraints>
  337 + <state key="normal" title="マップ作成">
  338 + <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  339 + </state>
  340 + <userDefinedRuntimeAttributes>
  341 + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
  342 + <integer key="value" value="5"/>
  343 + </userDefinedRuntimeAttribute>
  344 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.bt.map"/>
  345 + </userDefinedRuntimeAttributes>
  346 + </button>
  347 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="WALK" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3QV-Ov-PmX" customClass="AutoTransLabel">
  348 + <rect key="frame" x="10" y="391" width="70" height="30"/>
  349 + <constraints>
  350 + <constraint firstAttribute="height" constant="30" id="GSj-Tq-AsU"/>
  351 + <constraint firstAttribute="width" constant="70" id="uIv-Ty-eR2"/>
  352 + </constraints>
  353 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  354 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  355 + <nil key="highlightedColor"/>
  356 + <userDefinedRuntimeAttributes>
  357 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.walk"/>
  358 + </userDefinedRuntimeAttributes>
  359 + </label>
  360 + <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="4JZ-J2-3D9">
  361 + <rect key="frame" x="95" y="391" width="130" height="30"/>
  362 + <constraints>
  363 + <constraint firstAttribute="height" constant="30" id="JaF-D4-zT2"/>
  364 + <constraint firstAttribute="width" constant="130" id="qCj-P5-l4y"/>
  365 + </constraints>
  366 + <nil key="textColor"/>
  367 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  368 + <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
  369 + </textField>
  370 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="m" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o9b-Am-GTl">
  371 + <rect key="frame" x="240" y="391" width="70" height="30"/>
  372 + <constraints>
  373 + <constraint firstAttribute="width" constant="70" id="MN1-fg-mf1"/>
  374 + <constraint firstAttribute="height" constant="30" id="l7E-J3-Syw"/>
  375 + </constraints>
  376 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  377 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  378 + <nil key="highlightedColor"/>
  379 + <userDefinedRuntimeAttributes>
  380 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.name"/>
  381 + </userDefinedRuntimeAttributes>
  382 + </label>
  383 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="RUN" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bq4-nh-Cxk" customClass="AutoTransLabel">
  384 + <rect key="frame" x="10" y="429" width="70" height="30"/>
  385 + <constraints>
  386 + <constraint firstAttribute="height" constant="30" id="MmK-Nk-eFt"/>
  387 + <constraint firstAttribute="width" constant="70" id="nuP-fj-jk2"/>
  388 + </constraints>
  389 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  390 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  391 + <nil key="highlightedColor"/>
  392 + <userDefinedRuntimeAttributes>
  393 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.run"/>
  394 + </userDefinedRuntimeAttributes>
  395 + </label>
  396 + <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="3aE-uP-KLS">
  397 + <rect key="frame" x="95" y="429" width="130" height="30"/>
  398 + <constraints>
  399 + <constraint firstAttribute="height" constant="30" id="37e-2c-qka"/>
  400 + <constraint firstAttribute="width" constant="130" id="owG-Ob-QnB"/>
  401 + </constraints>
  402 + <nil key="textColor"/>
  403 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  404 + <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
  405 + </textField>
  406 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="m" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CGA-Xm-2ll">
  407 + <rect key="frame" x="240" y="429" width="70" height="30"/>
  408 + <constraints>
  409 + <constraint firstAttribute="width" constant="70" id="6cf-Y6-Dwq"/>
  410 + <constraint firstAttribute="height" constant="30" id="dHv-kM-AX2"/>
  411 + </constraints>
  412 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  413 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  414 + <nil key="highlightedColor"/>
  415 + <userDefinedRuntimeAttributes>
  416 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.name"/>
  417 + </userDefinedRuntimeAttributes>
  418 + </label>
  419 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="BIKE" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mvZ-9L-7a8" customClass="AutoTransLabel">
  420 + <rect key="frame" x="10" y="467" width="70" height="30"/>
  421 + <constraints>
  422 + <constraint firstAttribute="height" constant="30" id="hX2-SJ-SMG"/>
  423 + <constraint firstAttribute="width" constant="70" id="roN-jL-tXp"/>
  424 + </constraints>
  425 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  426 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  427 + <nil key="highlightedColor"/>
  428 + <userDefinedRuntimeAttributes>
  429 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.bike"/>
  430 + </userDefinedRuntimeAttributes>
  431 + </label>
  432 + <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="eOi-eo-GYn">
  433 + <rect key="frame" x="95" y="467" width="130" height="30"/>
  434 + <constraints>
  435 + <constraint firstAttribute="width" constant="130" id="SBb-jw-NHP"/>
  436 + <constraint firstAttribute="height" constant="30" id="ida-Ih-wRM"/>
  437 + </constraints>
  438 + <nil key="textColor"/>
  439 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  440 + <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
  441 + </textField>
  442 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="m" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="t6i-sV-ycx">
  443 + <rect key="frame" x="240" y="467" width="70" height="30"/>
  444 + <constraints>
  445 + <constraint firstAttribute="width" constant="70" id="DoG-hb-QbI"/>
  446 + <constraint firstAttribute="height" constant="30" id="pAs-GK-YE3"/>
  447 + </constraints>
  448 + <fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
  449 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  450 + <nil key="highlightedColor"/>
  451 + <userDefinedRuntimeAttributes>
  452 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.lbl.name"/>
  453 + </userDefinedRuntimeAttributes>
  454 + </label>
  455 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="sef-8T-0hQ" customClass="AutoTransButton">
  456 + <rect key="frame" x="10" y="509" width="300" height="30"/>
  457 + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  458 + <constraints>
  459 + <constraint firstAttribute="height" constant="30" id="8XP-Y1-hlJ"/>
  460 + </constraints>
  461 + <state key="normal" title="グループを作成する">
  462 + <color key="titleColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
  463 + </state>
  464 + <userDefinedRuntimeAttributes>
  465 + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
  466 + <integer key="value" value="5"/>
  467 + </userDefinedRuntimeAttribute>
  468 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.bt.createGr"/>
  469 + </userDefinedRuntimeAttributes>
  470 + <connections>
  471 + <action selector="clickCreateGroup:" destination="-1" eventType="touchUpInside" id="n8x-KR-til"/>
  472 + </connections>
  473 + </button>
  474 + </subviews>
  475 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  476 + <constraints>
  477 + <constraint firstItem="KTY-Ed-NJL" firstAttribute="leading" secondItem="9w1-87-U1W" secondAttribute="leading" constant="10" id="08M-tc-J6o"/>
  478 + <constraint firstItem="3QV-Ov-PmX" firstAttribute="leading" secondItem="qfU-7x-uss" secondAttribute="leading" id="1CN-mt-xv7"/>
  479 + <constraint firstItem="3aE-uP-KLS" firstAttribute="top" secondItem="bq4-nh-Cxk" secondAttribute="top" id="1YH-oa-gPy"/>
  480 + <constraint firstAttribute="trailing" secondItem="qfU-7x-uss" secondAttribute="trailing" constant="10" id="1fh-fC-Tvd"/>
  481 + <constraint firstItem="t6i-sV-ycx" firstAttribute="leading" secondItem="eOi-eo-GYn" secondAttribute="trailing" constant="15" id="2d5-8C-v4q"/>
  482 + <constraint firstItem="4JZ-J2-3D9" firstAttribute="top" secondItem="3QV-Ov-PmX" secondAttribute="top" id="2rO-Pd-t8O"/>
  483 + <constraint firstItem="t6i-sV-ycx" firstAttribute="top" secondItem="mvZ-9L-7a8" secondAttribute="top" id="4rc-co-XRr"/>
  484 + <constraint firstAttribute="trailing" secondItem="sef-8T-0hQ" secondAttribute="trailing" constant="10" id="89W-o8-uLa"/>
  485 + <constraint firstItem="qdi-Na-zsj" firstAttribute="leading" secondItem="9w1-87-U1W" secondAttribute="leading" constant="10" id="8Cr-Gt-ts7"/>
  486 + <constraint firstItem="ZtU-mt-3Ov" firstAttribute="leading" secondItem="9w1-87-U1W" secondAttribute="leading" constant="8" id="8QA-ZH-zig"/>
  487 + <constraint firstItem="KTY-Ed-NJL" firstAttribute="top" secondItem="ONn-27-HqB" secondAttribute="bottom" constant="8" id="8cI-hb-3IU"/>
  488 + <constraint firstItem="CGA-Xm-2ll" firstAttribute="leading" secondItem="3aE-uP-KLS" secondAttribute="trailing" constant="15" id="AJD-KP-oLm"/>
  489 + <constraint firstItem="qfU-7x-uss" firstAttribute="leading" secondItem="9w1-87-U1W" secondAttribute="leading" constant="10" id="Akh-2h-Y5Z"/>
  490 + <constraint firstItem="mvZ-9L-7a8" firstAttribute="leading" secondItem="qfU-7x-uss" secondAttribute="leading" id="CyJ-DC-cmk"/>
  491 + <constraint firstAttribute="trailing" secondItem="hWb-vU-yVd" secondAttribute="trailing" constant="10" id="Gpv-Cf-wmA"/>
  492 + <constraint firstItem="ONn-27-HqB" firstAttribute="leading" secondItem="9w1-87-U1W" secondAttribute="leading" constant="10" id="GqQ-jG-2Ss"/>
  493 + <constraint firstItem="Kpa-HJ-7cE" firstAttribute="top" secondItem="ONn-27-HqB" secondAttribute="top" id="I8B-QJ-8Kw"/>
  494 + <constraint firstItem="ONn-27-HqB" firstAttribute="top" secondItem="pXO-K0-vne" secondAttribute="bottom" constant="10" id="IUV-iX-zqx"/>
  495 + <constraint firstItem="pXO-K0-vne" firstAttribute="leading" secondItem="ZtU-mt-3Ov" secondAttribute="trailing" constant="10" id="JQi-T2-HRB"/>
  496 + <constraint firstItem="o9b-Am-GTl" firstAttribute="top" secondItem="3QV-Ov-PmX" secondAttribute="top" id="Osm-tS-nSE"/>
  497 + <constraint firstItem="sef-8T-0hQ" firstAttribute="top" secondItem="t6i-sV-ycx" secondAttribute="bottom" constant="12" id="PNY-xc-4go"/>
  498 + <constraint firstItem="3aE-uP-KLS" firstAttribute="leading" secondItem="bq4-nh-Cxk" secondAttribute="trailing" constant="15" id="QhW-Vx-RNc"/>
  499 + <constraint firstItem="mvZ-9L-7a8" firstAttribute="top" secondItem="bq4-nh-Cxk" secondAttribute="bottom" constant="8" id="Qu7-jT-zZM"/>
  500 + <constraint firstItem="qdi-Na-zsj" firstAttribute="top" secondItem="KTY-Ed-NJL" secondAttribute="bottom" constant="105" id="Rbx-GC-D0X"/>
  501 + <constraint firstItem="eOi-eo-GYn" firstAttribute="leading" secondItem="mvZ-9L-7a8" secondAttribute="trailing" constant="15" id="Rcg-h2-Qfa"/>
  502 + <constraint firstItem="pXO-K0-vne" firstAttribute="top" secondItem="ZtU-mt-3Ov" secondAttribute="top" id="T8M-OQ-0Wk"/>
  503 + <constraint firstItem="o9b-Am-GTl" firstAttribute="leading" secondItem="4JZ-J2-3D9" secondAttribute="trailing" constant="15" id="UyE-qx-Mtp"/>
  504 + <constraint firstItem="4JZ-J2-3D9" firstAttribute="top" secondItem="3QV-Ov-PmX" secondAttribute="top" id="aRK-i9-XKN"/>
  505 + <constraint firstItem="hWb-vU-yVd" firstAttribute="top" secondItem="Kpa-HJ-7cE" secondAttribute="bottom" constant="8" id="chw-2w-QOv"/>
  506 + <constraint firstItem="sef-8T-0hQ" firstAttribute="leading" secondItem="9w1-87-U1W" secondAttribute="leading" constant="10" id="dfN-4U-9Oc"/>
  507 + <constraint firstItem="eOi-eo-GYn" firstAttribute="top" secondItem="mvZ-9L-7a8" secondAttribute="top" id="e8C-p7-obk"/>
  508 + <constraint firstItem="bq4-nh-Cxk" firstAttribute="top" secondItem="3QV-Ov-PmX" secondAttribute="bottom" constant="8" id="gjA-dw-4j6"/>
  509 + <constraint firstItem="4JZ-J2-3D9" firstAttribute="leading" secondItem="3QV-Ov-PmX" secondAttribute="trailing" constant="15" id="hCs-KK-0oG"/>
  510 + <constraint firstItem="Kpa-HJ-7cE" firstAttribute="width" secondItem="ONn-27-HqB" secondAttribute="width" id="i0I-s6-95a"/>
  511 + <constraint firstAttribute="trailing" secondItem="pXO-K0-vne" secondAttribute="trailing" constant="10" id="j2H-Na-egE"/>
  512 + <constraint firstItem="bq4-nh-Cxk" firstAttribute="leading" secondItem="qfU-7x-uss" secondAttribute="leading" id="kTU-cF-wdS"/>
  513 + <constraint firstItem="hWb-vU-yVd" firstAttribute="leading" secondItem="KTY-Ed-NJL" secondAttribute="trailing" constant="8" id="ka5-tK-yxs"/>
  514 + <constraint firstItem="eOi-eo-GYn" firstAttribute="top" secondItem="mvZ-9L-7a8" secondAttribute="top" id="klA-2z-2Kx"/>
  515 + <constraint firstItem="3aE-uP-KLS" firstAttribute="top" secondItem="bq4-nh-Cxk" secondAttribute="top" id="pdY-Ef-eHr"/>
  516 + <constraint firstItem="3QV-Ov-PmX" firstAttribute="top" secondItem="qfU-7x-uss" secondAttribute="bottom" constant="8" id="qLb-a1-eOB"/>
  517 + <constraint firstItem="Kpa-HJ-7cE" firstAttribute="leading" secondItem="ONn-27-HqB" secondAttribute="trailing" constant="20" id="rMt-rx-zDY"/>
  518 + <constraint firstItem="KEy-T1-mdK" firstAttribute="top" secondItem="hWb-vU-yVd" secondAttribute="bottom" constant="15" id="sIJ-Rk-gj3"/>
  519 + <constraint firstItem="ZtU-mt-3Ov" firstAttribute="top" secondItem="9w1-87-U1W" secondAttribute="top" constant="10" id="tBp-C6-fjS"/>
  520 + <constraint firstItem="CGA-Xm-2ll" firstAttribute="top" secondItem="bq4-nh-Cxk" secondAttribute="top" id="uaB-yp-z16"/>
  521 + <constraint firstItem="qfU-7x-uss" firstAttribute="top" secondItem="KEy-T1-mdK" secondAttribute="bottom" constant="10" id="w4X-lJ-yL1"/>
  522 + <constraint firstAttribute="trailing" secondItem="Kpa-HJ-7cE" secondAttribute="trailing" constant="10" id="wvh-Lk-tt9"/>
  523 + <constraint firstItem="KEy-T1-mdK" firstAttribute="leading" secondItem="qdi-Na-zsj" secondAttribute="trailing" constant="8" id="xGa-CF-V9a"/>
  524 + </constraints>
  525 + </view>
  526 + </subviews>
  527 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  528 + <constraints>
  529 + <constraint firstItem="9w1-87-U1W" firstAttribute="leading" secondItem="aKu-bd-xMP" secondAttribute="leading" id="BLm-dD-oN3"/>
  530 + <constraint firstItem="9w1-87-U1W" firstAttribute="centerY" secondItem="aKu-bd-xMP" secondAttribute="centerY" id="DT9-CK-3ZL"/>
  531 + <constraint firstItem="9w1-87-U1W" firstAttribute="top" secondItem="aKu-bd-xMP" secondAttribute="top" id="PZC-BJ-DLV"/>
  532 + <constraint firstAttribute="trailing" secondItem="9w1-87-U1W" secondAttribute="trailing" id="RDM-mt-Fjr"/>
  533 + <constraint firstAttribute="bottom" secondItem="9w1-87-U1W" secondAttribute="bottom" constant="50" id="w42-vd-D7e"/>
  534 + <constraint firstItem="9w1-87-U1W" firstAttribute="centerX" secondItem="aKu-bd-xMP" secondAttribute="centerX" id="wJD-gn-ctq"/>
  535 + </constraints>
  536 + </scrollView>
  537 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="QYv-QM-Bkk" userLabel="ViewHeader">
  538 + <rect key="frame" x="0.0" y="0.0" width="320" height="46"/>
  539 + <subviews>
  540 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="コミュニティー グループ作成" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9hM-Gv-AxQ" customClass="AutoTransLabel">
  541 + <rect key="frame" x="0.0" y="0.0" width="320" height="46"/>
  542 + <fontDescription key="fontDescription" type="system" pointSize="16"/>
  543 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  544 + <nil key="highlightedColor"/>
  545 + <userDefinedRuntimeAttributes>
  546 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.createGr.title"/>
  547 + </userDefinedRuntimeAttributes>
  548 + </label>
  549 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="O23-Hy-4Ld">
  550 + <rect key="frame" x="0.0" y="5" width="70" height="36"/>
  551 + <constraints>
  552 + <constraint firstAttribute="width" constant="70" id="8vZ-Ta-Rzv"/>
  553 + </constraints>
  554 + <state key="normal" image="today_back_button"/>
  555 + <connections>
  556 + <action selector="clickBack:" destination="-1" eventType="touchUpInside" id="BO6-jx-vuO"/>
  557 + </connections>
  558 + </button>
  559 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fPg-VP-VkU">
  560 + <rect key="frame" x="275" y="0.0" width="45" height="46"/>
  561 + <constraints>
  562 + <constraint firstAttribute="width" constant="45" id="k1W-Oc-mRq"/>
  563 + </constraints>
  564 + <state key="normal" image="icon_menu"/>
  565 + </button>
  566 + </subviews>
  567 + <color key="backgroundColor" red="0.098039215690000001" green="0.098039215690000001" blue="0.098039215690000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  568 + <constraints>
  569 + <constraint firstAttribute="trailing" secondItem="9hM-Gv-AxQ" secondAttribute="trailing" id="5f8-Xt-vKd"/>
  570 + <constraint firstAttribute="bottom" secondItem="9hM-Gv-AxQ" secondAttribute="bottom" id="Q3z-hF-VbV"/>
  571 + <constraint firstItem="9hM-Gv-AxQ" firstAttribute="top" secondItem="QYv-QM-Bkk" secondAttribute="top" id="XNi-3d-xFW"/>
  572 + <constraint firstItem="O23-Hy-4Ld" firstAttribute="leading" secondItem="QYv-QM-Bkk" secondAttribute="leading" id="aMc-uz-vGA"/>
  573 + <constraint firstItem="fPg-VP-VkU" firstAttribute="top" secondItem="QYv-QM-Bkk" secondAttribute="top" id="bLC-DU-cJf"/>
  574 + <constraint firstItem="9hM-Gv-AxQ" firstAttribute="leading" secondItem="QYv-QM-Bkk" secondAttribute="leading" id="cUY-dT-Rh0"/>
  575 + <constraint firstAttribute="trailing" secondItem="fPg-VP-VkU" secondAttribute="trailing" id="fn0-SY-e1Z"/>
  576 + <constraint firstAttribute="height" constant="46" id="lBP-32-aFw"/>
  577 + <constraint firstItem="O23-Hy-4Ld" firstAttribute="top" secondItem="QYv-QM-Bkk" secondAttribute="top" constant="5" id="ogR-c4-QQ3"/>
  578 + <constraint firstAttribute="bottom" secondItem="fPg-VP-VkU" secondAttribute="bottom" id="wdr-SH-Wm2"/>
  579 + <constraint firstAttribute="bottom" secondItem="O23-Hy-4Ld" secondAttribute="bottom" constant="5" id="yJ4-81-rJx"/>
  580 + </constraints>
  581 + </view>
  582 + </subviews>
  583 + <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
  584 + <constraints>
  585 + <constraint firstItem="aKu-bd-xMP" firstAttribute="top" secondItem="QYv-QM-Bkk" secondAttribute="bottom" id="Q7l-Ra-0wb"/>
  586 + <constraint firstAttribute="trailing" secondItem="aKu-bd-xMP" secondAttribute="trailing" id="WAl-wE-FB4"/>
  587 + <constraint firstAttribute="trailing" secondItem="QYv-QM-Bkk" secondAttribute="trailing" id="XdX-OA-ALX"/>
  588 + <constraint firstItem="aKu-bd-xMP" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="cE7-y5-LL4"/>
  589 + <constraint firstItem="QYv-QM-Bkk" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="dAn-YE-2s3"/>
  590 + <constraint firstItem="QYv-QM-Bkk" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="fFF-bj-0uk"/>
  591 + <constraint firstAttribute="bottom" secondItem="aKu-bd-xMP" secondAttribute="bottom" id="oPE-ST-BIo"/>
  592 + </constraints>
  593 + <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
  594 + <point key="canvasLocation" x="26" y="125"/>
  595 + </view>
  596 + </objects>
  597 + <resources>
  598 + <image name="icon_menu" width="30" height="30"/>
  599 + <image name="today_back_button" width="73" height="37"/>
  600 + </resources>
  601 +</document>
LifeLog/LifeLog/Entities.h
... ... @@ -11,6 +11,7 @@
11 11  
12 12 #import <MBProgressHUD/MBProgressHUD.h>
13 13  
  14 +#import "MemberObject.h"
14 15 #import "GroupObject.h"
15 16 #import "TweetObject.h"
16 17 #import "HistoryGraphObject.h"
LifeLog/LifeLog/GroupDetailViewController.h
... ... @@ -9,17 +9,24 @@
9 9 #import <UIKit/UIKit.h>
10 10 #import "BaseTableViewController.h"
11 11 #import "Entities.h"
  12 +#import "AutoTransButton.h"
12 13  
13 14 @interface GroupDetailViewController : BaseTableViewController {
14 15 GroupObject * _curGroup;
  16 + BOOL isMemberList;
15 17 }
16 18 @property (weak, nonatomic) IBOutlet UIImageView *imgAva;
17 19  
18 20 @property (weak, nonatomic) IBOutlet UILabel *lblGrpName;
19 21 @property (weak, nonatomic) IBOutlet UILabel *lbbGrpActiveMode;
20 22 @property (weak, nonatomic) IBOutlet UILabel *lblGrpGoal;
21   -
22   -- (IBAction)clickBack:(id)sender;
  23 +@property (weak, nonatomic) IBOutlet AutoTransButton *btJoinGrp;
  24 +@property (weak, nonatomic) IBOutlet AutoTransButton *btSwitch;
23 25  
24 26 - (void) setGroup : (GroupObject *) object;
  27 +- (void) requestGroupDetail;
  28 +
  29 +- (IBAction)clickBack:(id)sender;
  30 +- (IBAction)clickSwitch:(AutoTransButton *)sender;
  31 +- (IBAction)clickJoin:(AutoTransButton *)sender;
25 32 @end
LifeLog/LifeLog/GroupDetailViewController.m
... ... @@ -21,11 +21,12 @@
21 21  
22 22 - (void)viewDidLoad {
23 23 [super viewDidLoad];
24   - [self setupView];
25   -
  24 + isMemberList = false;
26 25 //register nib for table view
27 26 [self.tableBase registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"];
28   -
  27 + if(_curGroup != nil) {
  28 + [self requestGroupDetail];
  29 + }
29 30 // Do any additional setup after loading the view from its nib.
30 31 }
31 32  
... ... @@ -40,33 +41,145 @@
40 41  
41 42 - (void)setupView {
42 43 if(_curGroup != nil) {
43   - self.lblGrpName.text = _curGroup.name;
44   - if(_curGroup.avatar && ![_curGroup.avatar isKindOfClass:[NSNull class]]) {
  44 + if(self.imgAva != nil && _curGroup.avatar && ![_curGroup.avatar isKindOfClass:[NSNull class]]) {
45 45 [self.imgAva sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:_curGroup.avatar]]];
46 46 }
47   - [self callRequestToUpdateData];
  47 + if(self.lblGrpName != nil) {
  48 + [self.lblGrpName setText:_curGroup.name];
  49 + }
  50 + if(self.btJoinGrp != nil) {
  51 + [self.btJoinGrp setHidden:false];
  52 + }
  53 + NSString *mode = @"";
  54 + NSString *goalText = [NSString stringWithFormat:@"%@\n", _curGroup.goal];
  55 + if(_curGroup.runMode || _curGroup.walkMode || _curGroup.bikeMode) {
  56 + goalText = [goalText stringByAppendingString:@"1日 目標 "];
  57 + }
  58 + if(_curGroup.runMode) {
  59 + mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.running", nil)];
  60 + mode = [mode stringByAppendingString:@"\n"];
  61 + goalText = [goalText stringByAppendingFormat:@"RUN %dm, ", _curGroup.runGoal];
  62 + }
  63 + if(_curGroup.walkMode) {
  64 + mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.walking", nil)];
  65 + mode = [mode stringByAppendingString:@"\n"];
  66 + goalText = [goalText stringByAppendingFormat:@"WALK %dm, ", _curGroup.walkGoal];
  67 + }
  68 + if(_curGroup.bikeMode) {
  69 + mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.bike", nil)];
  70 + mode = [mode stringByAppendingString:@"\n"];
  71 + goalText = [goalText stringByAppendingFormat:@"BIKE %dm, ", _curGroup.bikeGoal];
  72 + }
  73 + if(_curGroup.stepMode) {
  74 + mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.step", nil)];
  75 + mode = [mode stringByAppendingString:@"\n"];
  76 + }
  77 + if(_curGroup.beginMode) {
  78 + mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.begin", nil)];
  79 + mode = [mode stringByAppendingString:@"\n"];
  80 + }
  81 + if(_curGroup.gymMode) {
  82 + mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.gym", nil)];
  83 + mode = [mode stringByAppendingString:@"\n"];
  84 + }
  85 + NSRange range = [mode rangeOfString:@"\n" options:NSBackwardsSearch];
  86 + if(range.length > 0) {
  87 + mode = [mode stringByReplacingOccurrencesOfString:@"\n" withString:@"" options:NSBackwardsSearch range:range];
  88 + }
  89 + range = [goalText rangeOfString:@", " options:NSBackwardsSearch];
  90 + if(range.length > 0) {
  91 + goalText = [goalText stringByReplacingOccurrencesOfString:@", " withString:@"" options:NSBackwardsSearch range:range];
  92 + }
  93 + [self.lbbGrpActiveMode setText:mode];
  94 + [self.lblGrpGoal setText:goalText];
48 95 }
49 96 }
50 97  
  98 +- (void) requestGroupDetail {
  99 + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
  100 + MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
  101 + [[ServerAPI server] getGroupDetail:token withGroupID:_curGroup.groupID CompletionHandler:^(GroupObject *object, NSError *error) {
  102 + GroupDetailViewController __weak *weakSelf = self;
  103 + [_curGroup updateDate:object];
  104 + dispatch_async(dispatch_get_main_queue(), ^{
  105 + [hudView hideAnimated:true];
  106 + [weakSelf setupView];
  107 + [weakSelf callRequestToUpdateData];
  108 + });
  109 + }];
  110 +}
  111 +
51 112 #pragma mark IBAction
52 113  
53 114 - (IBAction)clickBack:(id)sender {
54 115 [self.navigationController popViewControllerAnimated:true];
55 116 }
56 117  
  118 +- (IBAction)clickSwitch:(AutoTransButton *)sender {
  119 + isMemberList = !isMemberList;
  120 + if(isMemberList) {
  121 + [sender setTitle:NSLocalizedString(@"lifelog.grDetail.bt.viewTweet", nil) forState:UIControlStateNormal];
  122 + }
  123 + else {
  124 + [sender setTitle:NSLocalizedString(@"lifelog.grDetail.bt.viewMem", nil) forState:UIControlStateNormal];
  125 + }
  126 + [sender setUserInteractionEnabled:false];
  127 + [self resetData];
  128 +}
  129 +
  130 +- (IBAction)clickJoin:(AutoTransButton *)sender {
  131 + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
  132 + MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
  133 + [[ServerAPI server] requestJoinGroup:token groupID:_curGroup.groupID CompletionHandler:^(NSError *error){
  134 + GroupDetailViewController __weak *weakSelf = self;
  135 + dispatch_async(dispatch_get_main_queue(), ^{
  136 + [hudView hideAnimated:true];
  137 + if(error == nil) {
  138 + _curGroup.isJoin = true;
  139 + [weakSelf.btJoinGrp setHidden:_curGroup.isJoin];
  140 + [Utilities showMessage:@"Join successfully" withViewController:weakSelf];
  141 + }
  142 + });
  143 + }];
  144 +
  145 +}
  146 +
  147 +
  148 +
57 149 #pragma mark UITableView Delegate
58 150 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
59 151 SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"];
60   - TweetObject *object = [_curDataList objectAtIndex:indexPath.row];
61   - if(object.avatarLink && ![object.avatarLink isKindOfClass:[NSNull class]]) {
62   - [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatarLink]]];
  152 + if(isMemberList) {
  153 + MemberObject *object = [_curDataList objectAtIndex:indexPath.row];
  154 + if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
  155 + [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
  156 + }
  157 + else {
  158 + [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
  159 + }
  160 + cell.lblUsername.text = @"";
  161 + cell.lblDateTime.text = @"";
  162 + cell.lblDes.text = object.userName;
  163 + cell.lblMode.text = @"";
  164 + cell.lblDistance.text = @"";
  165 + cell.lblDuration.text = @"";
  166 + }
  167 + else {
  168 + TweetObject *object = [_curDataList objectAtIndex:indexPath.row];
  169 + if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
  170 + [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
  171 + }
  172 + else {
  173 + [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
  174 + }
  175 + cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm" locale:@""];
  176 + cell.lblUsername.text = object.userName;
  177 + cell.lblDes.text = object.content;
  178 + cell.lblMode.text = object.mode;
  179 + cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance];
  180 + cell.lblDuration.text = object.time;
63 181 }
64   - cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm"];
65   - cell.lblUsername.text = object.userName;
66   - cell.lblDes.text = object.content;
67   - cell.lblMode.text = object.mode;
68   - cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance];
69   - cell.lblDuration.text = object.time;
  182 +
70 183 return cell;
71 184 }
72 185  
... ... @@ -80,15 +193,30 @@
80 193 if(_curPage == 1 && !self.refreshControl.isRefreshing) {
81 194 hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
82 195 }
83   - [[ServerAPI server] requestTweetsList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){
84   - dispatch_async(dispatch_get_main_queue(), ^{
85   - if(hudView != nil) {
86   - [hudView hideAnimated:true];
87   - }
88   - });
89   - GroupDetailViewController __weak *weakSelf = self;
90   - [weakSelf updateTableData:array error:error];
91   - }];
  196 + if(isMemberList) {
  197 + [[ServerAPI server] requestMemberList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){
  198 + dispatch_async(dispatch_get_main_queue(), ^{
  199 + if(hudView != nil) {
  200 + [hudView hideAnimated:true];
  201 + }
  202 + });
  203 + GroupDetailViewController __weak *weakSelf = self;
  204 + [weakSelf updateTableData:array error:error];
  205 + [weakSelf.btSwitch setUserInteractionEnabled:true];
  206 + }];
  207 + }
  208 + else {
  209 + [[ServerAPI server] requestTweetsList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){
  210 + dispatch_async(dispatch_get_main_queue(), ^{
  211 + if(hudView != nil) {
  212 + [hudView hideAnimated:true];
  213 + }
  214 + });
  215 + GroupDetailViewController __weak *weakSelf = self;
  216 + [weakSelf updateTableData:array error:error];
  217 + [weakSelf.btSwitch setUserInteractionEnabled:true];
  218 + }];
  219 + }
92 220 }
93 221  
94 222 @end
LifeLog/LifeLog/GroupDetailViewController.xib
... ... @@ -10,6 +10,8 @@
10 10 <objects>
11 11 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="GroupDetailViewController">
12 12 <connections>
  13 + <outlet property="btJoinGrp" destination="caN-x7-hJz" id="B17-YC-Rmk"/>
  14 + <outlet property="btSwitch" destination="gBg-k9-tgw" id="3ZZ-Qb-d3a"/>
13 15 <outlet property="imgAva" destination="qYg-Gw-R2b" id="f9w-A2-u4G"/>
14 16 <outlet property="lbbGrpActiveMode" destination="O8z-6V-YFd" id="s8J-3i-pW3"/>
15 17 <outlet property="lblGrpGoal" destination="Bdy-dI-j47" id="AKx-8y-Ifm"/>
... ... @@ -20,14 +22,14 @@
20 22 </placeholder>
21 23 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
22 24 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
23   - <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
  25 + <rect key="frame" x="0.0" y="0.0" width="320" height="567"/>
24 26 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
25 27 <subviews>
26 28 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="25d-3H-0fr" userLabel="ViewHeader">
27   - <rect key="frame" x="0.0" y="0.0" width="375" height="46"/>
  29 + <rect key="frame" x="0.0" y="0.0" width="320" height="46"/>
28 30 <subviews>
29 31 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SNS" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DxD-Cy-0wi" customClass="AutoTransLabel">
30   - <rect key="frame" x="0.0" y="0.0" width="375" height="46"/>
  32 + <rect key="frame" x="0.0" y="0.0" width="320" height="46"/>
31 33 <fontDescription key="fontDescription" type="system" pointSize="17"/>
32 34 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
33 35 <nil key="highlightedColor"/>
... ... @@ -46,7 +48,7 @@
46 48 </connections>
47 49 </button>
48 50 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="y09-DG-Krp">
49   - <rect key="frame" x="330" y="0.0" width="45" height="46"/>
  51 + <rect key="frame" x="275" y="0.0" width="45" height="46"/>
50 52 <constraints>
51 53 <constraint firstAttribute="width" constant="45" id="hHa-aE-1zd"/>
52 54 </constraints>
... ... @@ -68,46 +70,48 @@
68 70 <constraint firstAttribute="height" constant="46" id="u2G-4s-RB5"/>
69 71 </constraints>
70 72 </view>
71   - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YWV-pS-TCo">
72   - <rect key="frame" x="15" y="54" width="345" height="21"/>
  73 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YWV-pS-TCo">
  74 + <rect key="frame" x="15" y="54" width="290" height="21"/>
73 75 <constraints>
74 76 <constraint firstAttribute="height" constant="21" id="fQO-ja-W9R"/>
75 77 </constraints>
76   - <fontDescription key="fontDescription" type="system" pointSize="17"/>
  78 + <fontDescription key="fontDescription" type="system" pointSize="15"/>
77 79 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
78 80 <nil key="highlightedColor"/>
79 81 </label>
80   - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="O8z-6V-YFd">
81   - <rect key="frame" x="15" y="85" width="243" height="60"/>
  82 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="O8z-6V-YFd">
  83 + <rect key="frame" x="15" y="85" width="188" height="60"/>
  84 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
82 85 <constraints>
83   - <constraint firstAttribute="height" constant="60" id="Bid-NM-Ree"/>
  86 + <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="60" id="Bid-NM-Ree"/>
84 87 </constraints>
85   - <fontDescription key="fontDescription" type="system" pointSize="17"/>
  88 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
86 89 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
87 90 <nil key="highlightedColor"/>
88 91 </label>
89   - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bdy-dI-j47">
90   - <rect key="frame" x="15" y="161" width="345" height="80"/>
  92 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bdy-dI-j47">
  93 + <rect key="frame" x="15" y="160" width="290" height="0.0"/>
91 94 <constraints>
92   - <constraint firstAttribute="height" constant="80" id="jgH-57-Bae"/>
  95 + <constraint firstAttribute="height" relation="greaterThanOrEqual" id="jgH-57-Bae"/>
93 96 </constraints>
94   - <fontDescription key="fontDescription" type="system" pointSize="17"/>
  97 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
95 98 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
96 99 <nil key="highlightedColor"/>
97 100 </label>
98 101 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qYg-Gw-R2b">
99   - <rect key="frame" x="280" y="85" width="80" height="60"/>
  102 + <rect key="frame" x="225" y="85" width="80" height="60"/>
100 103 <constraints>
101 104 <constraint firstAttribute="width" constant="80" id="NEk-vg-zus"/>
102 105 <constraint firstAttribute="height" constant="60" id="qlv-ht-SUw"/>
103 106 </constraints>
104 107 </imageView>
105 108 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gBg-k9-tgw" customClass="AutoTransButton">
106   - <rect key="frame" x="15" y="271" width="162" height="30"/>
  109 + <rect key="frame" x="15" y="190" width="134.5" height="30"/>
107 110 <color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
108 111 <constraints>
109 112 <constraint firstAttribute="height" constant="30" id="6Ir-ZZ-NOb"/>
110 113 </constraints>
  114 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
111 115 <state key="normal" title="メンバーを見る">
112 116 <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
113 117 </state>
... ... @@ -117,13 +121,17 @@
117 121 </userDefinedRuntimeAttribute>
118 122 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.bt.viewMem"/>
119 123 </userDefinedRuntimeAttributes>
  124 + <connections>
  125 + <action selector="clickSwitch:" destination="-1" eventType="touchUpInside" id="z4V-ym-fqS"/>
  126 + </connections>
120 127 </button>
121   - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="caN-x7-hJz" customClass="AutoTransButton">
122   - <rect key="frame" x="197" y="271" width="162" height="30"/>
  128 + <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="caN-x7-hJz" customClass="AutoTransButton">
  129 + <rect key="frame" x="169.5" y="190" width="134.5" height="30"/>
123 130 <color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
124 131 <constraints>
125 132 <constraint firstAttribute="height" constant="30" id="gIs-Km-dbx"/>
126 133 </constraints>
  134 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
127 135 <state key="normal" title="グループに参加する">
128 136 <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
129 137 </state>
... ... @@ -133,9 +141,12 @@
133 141 </userDefinedRuntimeAttribute>
134 142 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.bt.joinGr"/>
135 143 </userDefinedRuntimeAttributes>
  144 + <connections>
  145 + <action selector="clickJoin:" destination="-1" eventType="touchUpInside" id="Ukt-bi-Sw2"/>
  146 + </connections>
136 147 </button>
137 148 <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="none" rowHeight="100" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="4VU-Ye-7Au">
138   - <rect key="frame" x="0.0" y="311" width="375" height="306"/>
  149 + <rect key="frame" x="0.0" y="230" width="320" height="287"/>
139 150 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
140 151 <connections>
141 152 <outlet property="dataSource" destination="-1" id="TLB-6X-bRI"/>
... ... @@ -167,9 +178,10 @@
167 178 <constraint firstItem="gBg-k9-tgw" firstAttribute="top" secondItem="Bdy-dI-j47" secondAttribute="bottom" constant="30" id="mgw-uX-VOK"/>
168 179 <constraint firstAttribute="trailing" secondItem="YWV-pS-TCo" secondAttribute="trailing" constant="15" id="rEO-bb-Pqr"/>
169 180 <constraint firstAttribute="trailing" secondItem="caN-x7-hJz" secondAttribute="trailing" constant="16" id="rRn-Vw-t5g"/>
170   - <constraint firstItem="Bdy-dI-j47" firstAttribute="top" secondItem="qYg-Gw-R2b" secondAttribute="bottom" constant="16" id="xXi-T2-c6K"/>
  181 + <constraint firstItem="Bdy-dI-j47" firstAttribute="top" secondItem="O8z-6V-YFd" secondAttribute="bottom" constant="15" id="xEO-fP-Riz"/>
171 182 <constraint firstAttribute="trailing" secondItem="4VU-Ye-7Au" secondAttribute="trailing" id="ylN-vm-QF2"/>
172 183 </constraints>
  184 + <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
173 185 <point key="canvasLocation" x="24.5" y="52.5"/>
174 186 </view>
175 187 </objects>
LifeLog/LifeLog/GroupObject.h
... ... @@ -13,6 +13,14 @@
13 13 @property (nonatomic) int groupID;
14 14 @property (nonatomic) int numSearch;
15 15  
  16 +@property (nonatomic) int walkGoal;
  17 +@property (nonatomic) int runGoal;
  18 +@property (nonatomic) int bikeGoal;
  19 +@property (nonatomic) int stepGoal;
  20 +@property (nonatomic) int gymGoal;
  21 +@property (nonatomic) int beginGoal;
  22 +
  23 +@property (nonatomic) BOOL isJoin;
16 24 @property (nonatomic) BOOL walkMode;
17 25 @property (nonatomic) BOOL runMode;
18 26 @property (nonatomic) BOOL bikeMode;
... ... @@ -22,8 +30,12 @@
22 30  
23 31 @property (nonatomic, strong) NSString * name;
24 32 @property (nonatomic, strong) NSString * avatar;
  33 +@property (nonatomic, strong) NSString * goal;
  34 +
25 35 @property (nonatomic, strong) NSDate * createDate;
26 36  
  37 +-(id) initWithShortData : (NSDictionary *) dict;
27 38 -(id) initWithData : (NSDictionary *) dict;
28   -
  39 +-(id) initWithData : (NSDictionary *) dict andGroupID : (int) groupID;
  40 +-(void) updateDate : (GroupObject *) obj;
29 41 @end
LifeLog/LifeLog/GroupObject.m
... ... @@ -11,23 +11,81 @@
11 11  
12 12 @implementation GroupObject
13 13  
14   --(id) initWithData : (NSDictionary *) dict {
15   - if([dict objectForKey:@"group_id"] != nil) {
16   - self.groupID = [dict[@"group_id"] intValue];
  14 +-(id) initWithShortData : (NSDictionary *) dict {
  15 + if([dict objectForKey:@"id"] != nil) {
  16 + self.groupID = [dict[@"id"] intValue];
17 17 }
18 18 if([dict objectForKey:@"group_name"] != nil) {
19 19 self.name = dict[@"group_name"];
20 20 }
  21 + return self;
  22 +}
  23 +
  24 +-(id) initWithData : (NSDictionary *) dict {
  25 + if([dict objectForKey:@"group_id"] != nil) {
  26 + self.groupID = [dict[@"group_id"] intValue];
  27 + }
21 28 if([dict objectForKey:@"group_avatar"] != nil) {
22 29 self.avatar = dict[@"group_avatar"];
23 30 }
  31 + if([dict objectForKey:@"created_at"] != nil && ![[dict objectForKey:@"created_at"] isKindOfClass:[NSNull class]]) {
  32 + NSString *dateString = dict[@"created_at"];
  33 + self.createDate = [Utilities dateFromString:dateString withFormat:@"yyyy-MM-dd hh:mm:ss"];
  34 + }
  35 + else {
  36 + self.createDate = [NSDate date];
  37 + }
  38 + if([dict objectForKey:@"num_search"] != nil) {
  39 + self.numSearch = [dict[@"num_search"] intValue];
  40 + }
  41 + [self parseData:dict];
  42 + return self;
  43 +}
  44 +
  45 +-(id) initWithData : (NSDictionary *) dict andGroupID : (int) groupID {
  46 + self.groupID = groupID;
  47 + if([dict objectForKey:@"join_group"] != nil && ![[dict objectForKey:@"join_group"] isKindOfClass:[NSNull class]]) {
  48 + self.isJoin = [dict[@"join_group"] boolValue];
  49 + }
  50 + if([dict objectForKey:@"goal"] != nil && ![[dict objectForKey:@"goal"] isKindOfClass:[NSNull class]]) {
  51 + self.goal = dict[@"goal"];
  52 + }
  53 + else {
  54 + self.goal = @"";
  55 + }
  56 + if([dict objectForKey:@"walk_mode_goal"] != nil && ![[dict objectForKey:@"walk_mode_goal"] isKindOfClass:[NSNull class]]) {
  57 + self.walkGoal = [dict[@"walk_mode_goal"] intValue];
  58 + }
  59 + if([dict objectForKey:@"run_mode_goal"] != nil && ![[dict objectForKey:@"run_mode_goal"] isKindOfClass:[NSNull class]]) {
  60 + self.runGoal = [dict[@"run_mode_goal"] intValue];
  61 + }
  62 + if([dict objectForKey:@"bike_mode_goal"] != nil && ![[dict objectForKey:@"bike_mode_goal"] isKindOfClass:[NSNull class]]) {
  63 + self.bikeGoal = [dict[@"bike_mode_goal"] intValue];
  64 + }
  65 + if([dict objectForKey:@"step_mode_goal"] != nil && ![[dict objectForKey:@"step_mode_goal"] isKindOfClass:[NSNull class]]) {
  66 + self.stepGoal = [dict[@"step_mode_goal"] intValue];
  67 + }
  68 + if([dict objectForKey:@"gym_mode_goal"] != nil && ![[dict objectForKey:@"gym_mode_goal"] isKindOfClass:[NSNull class]]) {
  69 + self.gymGoal = [dict[@"gym_mode_goal"] intValue];
  70 + }
  71 + if([dict objectForKey:@"beginer_mode_goal"] != nil && ![[dict objectForKey:@"beginer_mode_goal"] isKindOfClass:[NSNull class]]) {
  72 + self.beginGoal = [dict[@"beginer_mode_goal"] intValue];
  73 + }
  74 + [self parseData:dict];
  75 + return self;
  76 +}
  77 +
  78 +-(void) parseData : (NSDictionary *) dict {
  79 + if([dict objectForKey:@"group_name"] != nil) {
  80 + self.name = dict[@"group_name"];
  81 + }
24 82 if([dict objectForKey:@"walk_mode_active"] != nil && ![[dict objectForKey:@"walk_mode_active"] isKindOfClass:[NSNull class]]) {
25 83 self.walkMode = [dict[@"walk_mode_active"] boolValue];
26 84 }
27 85 if([dict objectForKey:@"run_mode_active"] != nil && ![[dict objectForKey:@"run_mode_active"] isKindOfClass:[NSNull class]]) {
28 86 self.runMode = [dict[@"run_mode_active"] boolValue];
29 87 }
30   - if([dict objectForKey:@"run_mode_active"] != nil && ![[dict objectForKey:@"run_mode_active"] isKindOfClass:[NSNull class]]) {
  88 + if([dict objectForKey:@"bike_mode_active"] != nil && ![[dict objectForKey:@"bike_mode_active"] isKindOfClass:[NSNull class]]) {
31 89 self.bikeMode = [dict[@"bike_mode_active"] boolValue];
32 90 }
33 91 if([dict objectForKey:@"step_mode_active"] != nil && ![[dict objectForKey:@"step_mode_active"] isKindOfClass:[NSNull class]]) {
... ... @@ -39,17 +97,24 @@
39 97 if([dict objectForKey:@"beginer_mode_active"] != nil && ![[dict objectForKey:@"beginer_mode_active"] isKindOfClass:[NSNull class]]) {
40 98 self.beginMode = [dict[@"beginer_mode_active"] boolValue];
41 99 }
42   - if([dict objectForKey:@"created_at"] != nil) {
43   - NSString *dateString = dict[@"created_at"];
44   - self.createDate = [Utilities dateFromString:dateString withFormat:@"yyyy-MM-dd hh:mm:ss"];
45   - }
46   - else {
47   - self.createDate = [NSDate date];
48   - }
49   - if([dict objectForKey:@"num_search"] != nil) {
50   - self.numSearch = [dict[@"num_search"] intValue];
51   - }
52   - return self;
  100 +}
  101 +
  102 +-(void) updateDate : (GroupObject *) obj {
  103 + self.name = obj.name;
  104 + self.walkMode = obj.walkMode;
  105 + self.runMode = obj.runMode;
  106 + self.bikeMode = obj.bikeMode;
  107 + self.stepMode = obj.stepMode;
  108 + self.gymMode = obj.gymMode;
  109 + self.beginMode = obj.beginMode;
  110 + self.isJoin = obj.isJoin;
  111 + self.goal = obj.goal;
  112 + self.walkGoal = obj.walkGoal;
  113 + self.runGoal = obj.runGoal;
  114 + self.bikeGoal = obj.bikeGoal;
  115 + self.stepGoal = obj.stepGoal;
  116 + self.gymGoal = obj.gymGoal;
  117 + self.beginGoal = obj.beginGoal;
53 118 }
54 119  
55 120 @end
LifeLog/LifeLog/HistoryObject.h
... ... @@ -18,6 +18,7 @@
18 18 @property (nonatomic) float calories;
19 19 @property (nonatomic, strong) NSString * time;
20 20 @property (nonatomic, strong) NSDate *date;
  21 +@property (nonatomic, strong) NSMutableArray *dataGraph;
21 22  
22 23 -(id) initWithData : (NSDictionary *) dict;
23 24  
LifeLog/LifeLog/HistoryObject.m
... ... @@ -11,17 +11,17 @@
11 11 @implementation HistoryObject
12 12  
13 13 -(id) initWithData : (NSDictionary *) dict {
14   - if([dict objectForKey:@"step"] != nil) {
  14 + if([dict objectForKey:@"steps"] != nil) {
15 15 self.step = [dict[@"step"] intValue];
16 16 }
17 17 if([dict objectForKey:@"target"] != nil) {
18 18 self.target = [dict[@"target"] intValue];
19 19 }
20   - if([dict objectForKey:@"missing"] != nil) {
21   - self.missing = [dict[@"missing"] intValue];
  20 + if([dict objectForKey:@"step_remain"] != nil) {
  21 + self.missing = [dict[@"step_remain"] intValue];
22 22 }
23   - if([dict objectForKey:@"percent"] != nil) {
24   - self.percent = [dict[@"percent"] floatValue];
  23 + if([dict objectForKey:@"complete_percent"] != nil) {
  24 + self.percent = [dict[@"complete_percent"] floatValue];
25 25 }
26 26 if([dict objectForKey:@"distance"] != nil) {
27 27 if([dict[@"distance"] isKindOfClass:[NSString class]]) {
... ... @@ -52,6 +52,15 @@
52 52 else {
53 53 self.date = [NSDate date];
54 54 }
  55 + if([dict objectForKey:@"data_chart"] != nil) {
  56 + self.dataGraph = [[NSMutableArray alloc] init];
  57 + NSDictionary * graph = [dict objectForKey:@"data_chart"];
  58 + if([graph count] == 24) {
  59 + for(int i = 0; i < 24; i++) {
  60 + [self.dataGraph addObject:[graph objectForKey:[NSString stringWithFormat:@"%d", i]]];
  61 + }
  62 + }
  63 + }
55 64 return self;
56 65 }
57 66 @end
LifeLog/LifeLog/HistoryViewController.h
... ... @@ -15,10 +15,11 @@
15 15 #import "Entities.h"
16 16  
17 17 @interface HistoryViewController : BaseTableViewController <UIScrollViewDelegate> {
18   - NSDate * _curDate;
19   - HistoryObject * _curHisObj;
20   - HistoryGraphObject * _curHisGraphObj;
  18 + NSDate * _startDate;
  19 + NSDate * _endDate;
  20 + NSArray * _curHisArray;
21 21 }
  22 +@property (weak, nonatomic) IBOutlet UILabel *lblDatetime;
22 23  
23 24 @property (weak, nonatomic) IBOutlet UILabel *lblCircleStep;
24 25 @property (weak, nonatomic) IBOutlet UILabel *lblCircleRemain;
... ... @@ -39,5 +40,7 @@
39 40 @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
40 41  
41 42 - (IBAction)swipeAction:(UISwipeGestureRecognizer *)sender;
  43 +- (IBAction)clickBackward:(UIButton *)sender;
  44 +- (IBAction)clickForward:(UIButton *)sender;
42 45  
43 46 @end
LifeLog/LifeLog/HistoryViewController.m
... ... @@ -26,7 +26,10 @@
26 26 [self setupView];
27 27 [self setupChartView];
28 28  
29   - _curDate = [NSDate date];
  29 + _startDate = [NSDate date];
  30 + _endDate = _startDate;
  31 +
  32 + self.lblDatetime.text = [Utilities stringFromDate:_endDate withFormat:@"YYYY年MM月dd日 EEEE" locale:@"ja_JP"];
30 33  
31 34 [self checkRequestData];
32 35  
... ... @@ -54,7 +57,7 @@
54 57 [self.viewCollectionType setSpacing:2];
55 58 [self.viewCollectionType setArrayTitle:typeTitle];
56 59 self.viewCollectionType.changeCurrentIndex = ^(int index){
57   - [self checkRequestData];
  60 + [self changeDate];
58 61 };
59 62  
60 63 NSArray *modeTitle = [NSArray arrayWithObjects:NSLocalizedString(@"lifelog.history.mode.1", nil), NSLocalizedString(@"lifelog.history.mode.2", nil), NSLocalizedString(@"lifelog.history.mode.3", nil), nil];
... ... @@ -64,7 +67,7 @@
64 67 [self.viewCollectionMode setNormalColor:[Utilities convertHecToColor:0x191919] highlightColor:[Utilities convertHecToColor:0x474747] textColor:[UIColor whiteColor]];
65 68 [self.viewCollectionMode setArrayTitle:modeTitle];
66 69 self.viewCollectionMode.changeCurrentIndex = ^(int index){
67   - [self checkRequestData];
  70 + [self updateView];
68 71 };
69 72  
70 73 NSArray *shareTitle = [NSArray arrayWithObjects:NSLocalizedString(@"lifelog.history.share.1", nil), NSLocalizedString(@"lifelog.history.share.2", nil), NSLocalizedString(@"lifelog.history.share.3", nil), NSLocalizedString(@"lifelog.history.share.4", nil), NSLocalizedString(@"lifelog.history.share.5", nil), nil];
... ... @@ -102,19 +105,23 @@
102 105 }
103 106  
104 107 -(void) updateView {
105   - self.lblStep.text = [NSString stringWithFormat:@"%d", _curHisObj.step];
106   - self.lblRemaining.text = [NSString stringWithFormat:@"%d", _curHisObj.missing];
107   - self.lblPercent.text = [NSString stringWithFormat:@"%0.2f", _curHisObj.percent * 100];
108   - self.lblCalories.text = [NSString stringWithFormat:@"%0.2f", _curHisObj.calories];
109   - self.lblDistance.text = [NSString stringWithFormat:@"%0.1f", _curHisObj.distance];
110   - self.lblTime.text = _curHisObj.time;
  108 + HistoryObject * obj = [_curHisArray objectAtIndex:self.viewCollectionMode.getCurrentIndex];
  109 + self.lblStep.text = [NSString stringWithFormat:@"%d", obj.step];
  110 + self.lblRemaining.text = [NSString stringWithFormat:@"%d", obj.missing];
  111 + self.lblPercent.text = [NSString stringWithFormat:@"%0.2f", obj.percent * 100];
  112 + self.lblCalories.text = [NSString stringWithFormat:@"%0.2f", obj.calories];
  113 + self.lblDistance.text = [NSString stringWithFormat:@"%0.1f", obj.distance];
  114 + self.lblTime.text = obj.time;
  115 + [self updateGraphView];
111 116 }
112 117  
113 118 -(void) updateGraphView {
  119 + HistoryObject * obj = [_curHisArray objectAtIndex:self.viewCollectionMode.getCurrentIndex];
  120 +
114 121 NSMutableArray *yVals = [[NSMutableArray alloc] init];
115   - for (int i = 0; i < _curHisGraphObj.arrayStep.count; i++)
  122 + for (int i = 0; i < obj.dataGraph.count; i++)
116 123 {
117   - [yVals addObject:[[BarChartDataEntry alloc] initWithX:i y:[[_curHisGraphObj.arrayStep objectAtIndex:i] doubleValue]]];
  124 + [yVals addObject:[[BarChartDataEntry alloc] initWithX:i y:[[obj.dataGraph objectAtIndex:i] doubleValue]]];
118 125 }
119 126  
120 127 BarChartDataSet *set1 = nil;
... ... @@ -143,10 +150,8 @@
143 150 -(void) checkRequestData {
144 151 if(self.tableBase.alpha == 0.0) {
145 152 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
146   - int type = self.viewCollectionType.getCurrentIndex;
147   - int mode = self.viewCollectionMode.getCurrentIndex + 1;
148 153 MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
149   - [[ServerAPI server] requestHistory:token atDate:_curDate withType:type andMode:mode CompletionHandler:^(HistoryObject *object, NSError *error) {
  154 + [[ServerAPI server] requestHistory:token startDate:_startDate endDate:_endDate CompletionHandler:^(NSArray *array, NSError *error) {
150 155 HistoryViewController __weak *weakSelf = self;
151 156 dispatch_async(dispatch_get_main_queue(), ^{
152 157 if(hudView != nil) {
... ... @@ -154,7 +159,7 @@
154 159 }
155 160 });
156 161 if(error == nil) {
157   - _curHisObj = object;
  162 + _curHisArray = array;
158 163 dispatch_async(dispatch_get_main_queue(), ^{
159 164 [weakSelf updateView];
160 165 });
... ... @@ -166,22 +171,6 @@
166 171 });
167 172 }
168 173 }];
169   -
170   - [[ServerAPI server] requestHistoryGraph:token withType:type andMode:mode CompletionHandler:^(HistoryGraphObject *object, NSError *error) {
171   - HistoryViewController __weak *weakSelf = self;
172   - if(error == nil) {
173   - _curHisGraphObj = object;
174   - dispatch_async(dispatch_get_main_queue(), ^{
175   - [self updateGraphView];
176   - });
177   - }
178   - else {
179   - dispatch_async(dispatch_get_main_queue(), ^{
180   - NSString *message = [error.userInfo objectForKey:@"message"];
181   - [Utilities showErrorMessage:message withViewController:weakSelf];
182   - });
183   - }
184   - }];
185 174 }
186 175 else {
187 176 [self resetData];
... ... @@ -209,6 +198,27 @@
209 198 }];
210 199 }
211 200  
  201 +- (void) changeDate {
  202 + switch (self.viewCollectionType.getCurrentIndex) {
  203 + case 1:
  204 + _startDate = [_endDate dateByAddingTimeInterval:-86400 * 7];
  205 + break;
  206 + case 2:
  207 + _startDate = [_endDate dateByAddingTimeInterval:-86400 * 30];
  208 + break;
  209 + case 3:
  210 + _startDate = [_endDate dateByAddingTimeInterval:-86400 * 30 * 3];
  211 + break;
  212 + case 4:
  213 + _startDate = [_endDate dateByAddingTimeInterval:-86400 * 30 * 6];
  214 + break;
  215 + default:
  216 + _startDate = _endDate;
  217 + break;
  218 + }
  219 + [self checkRequestData];
  220 +}
  221 +
212 222 #pragma mark IBAction
213 223 -(void) swipeAction:(UISwipeGestureRecognizer *)sender {
214 224 bool alphaValue = self.scrollView.alpha == 1.0 ? 1.0 : 0.0;
... ... @@ -220,6 +230,18 @@
220 230 }];
221 231 }
222 232  
  233 +- (IBAction)clickBackward:(UIButton *)sender {
  234 + _endDate = [_endDate dateByAddingTimeInterval:-86400];
  235 + self.lblDatetime.text = [Utilities stringFromDate:_endDate withFormat:@"YYYY年MM月dd日 EEEE" locale:@"ja_JP"];
  236 + [self changeDate];
  237 +}
  238 +
  239 +- (IBAction)clickForward:(UIButton *)sender {
  240 + _endDate = [_endDate dateByAddingTimeInterval:86400];
  241 + self.lblDatetime.text = [Utilities stringFromDate:_endDate withFormat:@"YYYY年MM月dd日 EEEE" locale:@"ja_JP"];
  242 + [self changeDate];
  243 +}
  244 +
223 245 -(void)gestureAction:(UITapGestureRecognizer *) sender
224 246 {
225 247 CGPoint touchLocation = [sender locationOfTouch:0 inView:self.viewCollectionShare];
LifeLog/LifeLog/HistoryViewController.xib
1 1 <?xml version="1.0" encoding="UTF-8"?>
2   -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
  2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12118" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
3 3 <device id="retina4_7" orientation="portrait">
4 4 <adaptation id="fullscreen"/>
5 5 </device>
6 6 <dependencies>
7   - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
  7 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12086"/>
8 8 <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
9 9 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
10 10 </dependencies>
... ... @@ -14,6 +14,7 @@
14 14 <outlet property="lblCalories" destination="dAE-C8-QLr" id="WaS-S3-Qxh"/>
15 15 <outlet property="lblCircleRemain" destination="Kr7-S0-Fpl" id="UQe-Bt-i0X"/>
16 16 <outlet property="lblCircleStep" destination="oWg-A8-aCr" id="Q9g-UY-hyv"/>
  17 + <outlet property="lblDatetime" destination="EM7-vA-s1e" id="0fK-4u-TaK"/>
17 18 <outlet property="lblDistance" destination="1tR-JC-pyw" id="q4s-Ru-vLO"/>
18 19 <outlet property="lblPercent" destination="8Ru-Jc-Ouv" id="ZHn-Kt-0Qk"/>
19 20 <outlet property="lblRemaining" destination="1NH-b3-ST8" id="hFc-q9-b0h"/>
... ... @@ -45,7 +46,7 @@
45 46 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.history.title"/>
46 47 </userDefinedRuntimeAttributes>
47 48 </label>
48   - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ytc-zM-ZGC">
  49 + <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ytc-zM-ZGC">
49 50 <rect key="frame" x="0.0" y="5" width="70" height="36"/>
50 51 <constraints>
51 52 <constraint firstAttribute="width" constant="70" id="xAE-oP-WEf"/>
... ... @@ -84,11 +85,17 @@
84 85 <constraint firstAttribute="width" secondItem="6T2-M9-9wV" secondAttribute="height" multiplier="1:1" id="RlM-6u-eer"/>
85 86 </constraints>
86 87 <state key="normal" backgroundImage="arrow_back"/>
  88 + <connections>
  89 + <action selector="clickBackward:" destination="-1" eventType="touchUpInside" id="pwN-yT-qyp"/>
  90 + </connections>
87 91 </button>
88 92 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Cwb-8M-pDi">
89 93 <rect key="frame" x="320" y="0.0" width="35" height="35"/>
90 94 <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
91 95 <state key="normal" backgroundImage="arrow_next"/>
  96 + <connections>
  97 + <action selector="clickForward:" destination="-1" eventType="touchUpInside" id="1NC-km-Lfe"/>
  98 + </connections>
92 99 </button>
93 100 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2017年1月1日 日曜日" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EM7-vA-s1e">
94 101 <rect key="frame" x="40" y="2" width="275" height="31"/>
LifeLog/LifeLog/Localizable.strings
No preview for this file type
LifeLog/LifeLog/MemberObject.h
... ... @@ -0,0 +1,25 @@
  1 +//
  2 +// MemberObject.h
  3 +// LifeLog
  4 +//
  5 +// Created by nvtu on 8/18/17.
  6 +// Copyright © 2017 PhongNV. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +@interface MemberObject : NSObject
  12 +
  13 +@property (nonatomic) int userID;
  14 +@property (nonatomic) int gender;
  15 +
  16 +@property (nonatomic, strong) NSString * userName;
  17 +@property (nonatomic, strong) NSString * nickName;
  18 +@property (nonatomic, strong) NSString * avatar;
  19 +
  20 +@property (nonatomic, strong) NSDate * joinDate;
  21 +@property (nonatomic, strong) NSDate * birthDay;
  22 +
  23 +-(id) initWithData : (NSDictionary *) dict;
  24 +
  25 +@end
LifeLog/LifeLog/MemberObject.m
... ... @@ -0,0 +1,47 @@
  1 +//
  2 +// MemberObject.m
  3 +// LifeLog
  4 +//
  5 +// Created by nvtu on 8/18/17.
  6 +// Copyright © 2017 PhongNV. All rights reserved.
  7 +//
  8 +
  9 +#import "MemberObject.h"
  10 +#import "Utilities.h"
  11 +
  12 +@implementation MemberObject
  13 +
  14 +-(id) initWithData : (NSDictionary *) dict {
  15 + if([dict objectForKey:@"user_id"] != nil) {
  16 + self.userID = [dict[@"user_id"] intValue];
  17 + }
  18 + if([dict objectForKey:@"gender"] != nil) {
  19 + self.gender = [dict[@"gender"] intValue];
  20 + }
  21 + if([dict objectForKey:@"username"] != nil) {
  22 + self.userName = dict[@"username"];
  23 + }
  24 + if([dict objectForKey:@"nickname"] != nil) {
  25 + self.nickName = dict[@"nickname"];
  26 + }
  27 + if([dict objectForKey:@"profile_image"] != nil) {
  28 + self.avatar = dict[@"profile_image"];
  29 + }
  30 + if([dict objectForKey:@"birthday"] != nil) {
  31 + NSString *dateString = dict[@"birthday"];
  32 + self.birthDay = [Utilities dateFromString:dateString withFormat:@"yyyy-MM-dd"];
  33 + }
  34 + else {
  35 + self.birthDay = [NSDate date];
  36 + }
  37 + if([dict objectForKey:@"join_date"] != nil) {
  38 + NSString *dateString = dict[@"join_date"];
  39 + self.joinDate = [Utilities dateFromString:dateString withFormat:@"yyyy-MM-dd HH:mm:ss"];
  40 + }
  41 + else {
  42 + self.joinDate = [NSDate date];
  43 + }
  44 + return self;
  45 +}
  46 +
  47 +@end
LifeLog/LifeLog/MyGroupViewController.h
... ... @@ -0,0 +1,23 @@
  1 +//
  2 +// MyGroupViewController.h
  3 +// LifeLog
  4 +//
  5 +// Created by nvtu on 8/20/17.
  6 +// Copyright © 2017 PhongNV. All rights reserved.
  7 +//
  8 +
  9 +#import <UIKit/UIKit.h>
  10 +#import "GroupDetailViewController.h"
  11 +#import "AutoTransButton.h"
  12 +#import "Entities.h"
  13 +
  14 +@interface MyGroupViewController : GroupDetailViewController {
  15 + NSMutableArray *_curListGrp;
  16 +}
  17 +
  18 +@property (weak, nonatomic) IBOutlet UITableView *tableGrp;
  19 +@property (weak, nonatomic) IBOutlet UIButton *btShowGrp;
  20 +
  21 +- (IBAction)clickShowGrp:(id)sender;
  22 +
  23 +@end
LifeLog/LifeLog/MyGroupViewController.m
... ... @@ -0,0 +1,170 @@
  1 +//
  2 +// MyGroupViewController.m
  3 +// LifeLog
  4 +//
  5 +// Created by nvtu on 8/20/17.
  6 +// Copyright © 2017 PhongNV. All rights reserved.
  7 +//
  8 +
  9 +#import "MyGroupViewController.h"
  10 +#import <SDWebImage/UIImageView+WebCache.h>
  11 +
  12 +#import "Utilities.h"
  13 +#import "ServerAPI.h"
  14 +#import "SNSRecentTopicTableViewCell.h"
  15 +
  16 +@interface MyGroupViewController ()
  17 +
  18 +@end
  19 +
  20 +@implementation MyGroupViewController
  21 +
  22 +- (void)viewDidLoad {
  23 + [super viewDidLoad];
  24 + isMemberList = false;
  25 + _curListGrp = [[NSMutableArray alloc] init];
  26 + [self.tableBase registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"];
  27 +
  28 + [self requestGroupList];
  29 + // Do any additional setup after loading the view from its nib.
  30 +}
  31 +
  32 +- (void)didReceiveMemoryWarning {
  33 + [super didReceiveMemoryWarning];
  34 + // Dispose of any resources that can be recreated.
  35 +}
  36 +
  37 +#pragma mark IBAction
  38 +
  39 +- (IBAction)clickBack:(id)sender {
  40 + [self.navigationController popViewControllerAnimated:true];
  41 +}
  42 +
  43 +- (IBAction)clickShowGrp:(id)sender {
  44 + self.tableGrp.hidden = !self.tableGrp.isHidden;
  45 +}
  46 +
  47 +- (IBAction)clickSwitch:(id)sender {
  48 + isMemberList = !isMemberList;
  49 + if(isMemberList) {
  50 + [sender setTitle:NSLocalizedString(@"lifelog.grDetail.bt.viewTweet", nil) forState:UIControlStateNormal];
  51 + }
  52 + else {
  53 + [sender setTitle:NSLocalizedString(@"lifelog.grDetail.bt.viewMem", nil) forState:UIControlStateNormal];
  54 + }
  55 + [sender setUserInteractionEnabled:false];
  56 + [self resetData];
  57 +}
  58 +
  59 +#pragma mark UITableView Delegate
  60 +-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
  61 + if(tableView == self.tableGrp)
  62 + return 1;
  63 + else
  64 + return [super numberOfSectionsInTableView:tableView];
  65 +}
  66 +
  67 +- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  68 + if(tableView == self.tableGrp)
  69 + return _curListGrp.count;
  70 + else
  71 + return [super tableView:tableView numberOfRowsInSection:section];
  72 +}
  73 +
  74 +- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  75 + if(tableView == self.tableGrp) {
  76 + UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"GroupCell"];
  77 + if(cell == nil) {
  78 + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"GroupCell"];
  79 + }
  80 + GroupObject *object = [_curListGrp objectAtIndex:indexPath.row];
  81 + cell.textLabel.text = object.name;
  82 + return cell;
  83 + }
  84 + else {
  85 + SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"];
  86 + if(isMemberList) {
  87 + MemberObject *object = [_curDataList objectAtIndex:indexPath.row];
  88 + if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
  89 + [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
  90 + }
  91 + else {
  92 + [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
  93 + }
  94 + cell.lblUsername.text = @"";
  95 + cell.lblDateTime.text = @"";
  96 + cell.lblDes.text = object.userName;
  97 + cell.lblMode.text = @"";
  98 + cell.lblDistance.text = @"";
  99 + cell.lblDuration.text = @"";
  100 + }
  101 + else {
  102 + TweetObject *object = [_curDataList objectAtIndex:indexPath.row];
  103 + if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
  104 + [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
  105 + }
  106 + else {
  107 + [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
  108 + }
  109 + cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm" locale:@""];
  110 + cell.lblUsername.text = object.userName;
  111 + cell.lblDes.text = object.content;
  112 + cell.lblMode.text = object.mode;
  113 + cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance];
  114 + cell.lblDuration.text = object.time;
  115 + }
  116 + return cell;
  117 + }
  118 +}
  119 +
  120 +- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
  121 + if(tableView == self.tableGrp) {
  122 + return;
  123 + }
  124 + [super tableView:tableView willDisplayCell:cell forRowAtIndexPath:indexPath];
  125 +}
  126 +
  127 +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  128 + if(tableView == self.tableGrp) {
  129 + [tableView setHidden:true];
  130 + [self resetGroupData:indexPath.row];
  131 + }
  132 +}
  133 +
  134 +#pragma mark Private Function
  135 +
  136 +- (void) resetGroupData : (int) index {
  137 + _curGroup = [_curListGrp objectAtIndex:index];
  138 + self.lblGrpName.text = _curGroup.name;
  139 + [_curDataList removeAllObjects];
  140 + [self.tableBase reloadData];
  141 + [self requestGroupDetail];
  142 +}
  143 +
  144 +- (void) requestGroupList {
  145 + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
  146 + MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
  147 + [[ServerAPI server] requestGroupList:token CompletionHandler:^(NSArray *array, NSError *error) {
  148 + dispatch_async(dispatch_get_main_queue(), ^{
  149 + [hudView hideAnimated:true];
  150 + });
  151 + if(error == nil) {
  152 + [_curListGrp removeAllObjects];
  153 + [_curListGrp addObjectsFromArray:array];
  154 + MyGroupViewController __weak *weakSelf = self;
  155 + dispatch_async(dispatch_get_main_queue(), ^{
  156 + [hudView hideAnimated:true];
  157 + [self.tableGrp reloadData];
  158 + if(_curListGrp.count > 0) {
  159 + [weakSelf resetGroupData:0];
  160 + }
  161 + else {
  162 + weakSelf.lblGrpName.text = @"No Group";
  163 + }
  164 + [weakSelf.btShowGrp setEnabled:(_curListGrp.count > 0)];
  165 + });
  166 + }
  167 + }];
  168 +}
  169 +
  170 +@end
LifeLog/LifeLog/MyGroupViewController.xib
... ... @@ -0,0 +1,241 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12118" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
  3 + <device id="retina4_7" orientation="portrait">
  4 + <adaptation id="fullscreen"/>
  5 + </device>
  6 + <dependencies>
  7 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12086"/>
  8 + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
  9 + </dependencies>
  10 + <objects>
  11 + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MyGroupViewController">
  12 + <connections>
  13 + <outlet property="btShowGrp" destination="MvK-5R-njL" id="bcb-N7-jbu"/>
  14 + <outlet property="btSwitch" destination="eBu-7L-nsx" id="od6-v0-6eh"/>
  15 + <outlet property="lbbGrpActiveMode" destination="P1r-ft-imP" id="gw7-xu-kL1"/>
  16 + <outlet property="lblGrpGoal" destination="ftA-wa-19F" id="YFk-py-xd2"/>
  17 + <outlet property="lblGrpName" destination="xXv-SO-m4h" id="qik-wo-Usx"/>
  18 + <outlet property="tableBase" destination="ubS-v9-zCa" id="gea-9H-gpI"/>
  19 + <outlet property="tableGrp" destination="dtD-J5-dze" id="ahq-Cd-85X"/>
  20 + <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
  21 + </connections>
  22 + </placeholder>
  23 + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
  24 + <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
  25 + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
  26 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
  27 + <subviews>
  28 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vxT-xe-7mV" userLabel="ViewHeader">
  29 + <rect key="frame" x="0.0" y="0.0" width="375" height="46"/>
  30 + <subviews>
  31 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SNS" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Txe-1I-61m" customClass="AutoTransLabel">
  32 + <rect key="frame" x="0.0" y="0.0" width="375" height="46"/>
  33 + <fontDescription key="fontDescription" type="system" pointSize="17"/>
  34 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  35 + <nil key="highlightedColor"/>
  36 + <userDefinedRuntimeAttributes>
  37 + <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.title"/>
  38 + </userDefinedRuntimeAttributes>
  39 + </label>
  40 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DjI-qB-WTG">
  41 + <rect key="frame" x="0.0" y="5" width="70" height="36"/>
  42 + <constraints>
  43 + <constraint firstAttribute="width" constant="70" id="Q1G-tI-sgx"/>
  44 + </constraints>
  45 + <state key="normal" image="today_back_button"/>
  46 + <connections>
  47 + <action selector="clickBack:" destination="-1" eventType="touchUpInside" id="93y-uZ-J2W"/>
  48 + </connections>
  49 + </button>
  50 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="7gh-nf-sKZ">
  51 + <rect key="frame" x="330" y="0.0" width="45" height="46"/>
  52 + <constraints>
  53 + <constraint firstAttribute="width" constant="45" id="Vw3-60-kvV"/>
  54 + </constraints>
  55 + <state key="normal" image="icon_menu"/>
  56 + </button>
  57 + </subviews>
  58 + <color key="backgroundColor" red="0.098039215690000001" green="0.098039215690000001" blue="0.098039215690000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  59 + <constraints>
  60 + <constraint firstAttribute="trailing" secondItem="7gh-nf-sKZ" secondAttribute="trailing" id="2JD-YU-WS2"/>
  61 + <constraint firstItem="Txe-1I-61m" firstAttribute="leading" secondItem="vxT-xe-7mV" secondAttribute="leading" id="30c-J3-6ba"/>
  62 + <constraint firstAttribute="bottom" secondItem="7gh-nf-sKZ" secondAttribute="bottom" id="61g-Gv-ka0"/>
  63 + <constraint firstAttribute="bottom" secondItem="Txe-1I-61m" secondAttribute="bottom" id="BZZ-wj-MGj"/>
  64 + <constraint firstItem="7gh-nf-sKZ" firstAttribute="top" secondItem="vxT-xe-7mV" secondAttribute="top" id="DKT-Ea-U3k"/>
  65 + <constraint firstAttribute="trailing" secondItem="Txe-1I-61m" secondAttribute="trailing" id="WA1-1W-49C"/>
  66 + <constraint firstItem="DjI-qB-WTG" firstAttribute="leading" secondItem="vxT-xe-7mV" secondAttribute="leading" id="tA3-JF-Kjj"/>
  67 + <constraint firstAttribute="bottom" secondItem="DjI-qB-WTG" secondAttribute="bottom" constant="5" id="uFc-I1-M2c"/>
  68 + <constraint firstItem="Txe-1I-61m" firstAttribute="top" secondItem="vxT-xe-7mV" secondAttribute="top" id="ucO-rK-wAV"/>
  69 + <constraint firstItem="DjI-qB-WTG" firstAttribute="top" secondItem="vxT-xe-7mV" secondAttribute="top" constant="5" id="vR3-xv-3hD"/>
  70 + <constraint firstAttribute="height" constant="46" id="yIJ-Mu-bPA"/>
  71 + </constraints>
  72 + </view>
  73 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hhh-nO-yn5">
  74 + <rect key="frame" x="15" y="54" width="345" height="36"/>
  75 + <subviews>
  76 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="MvK-5R-njL">
  77 + <rect key="frame" x="289" y="0.0" width="56" height="36"/>
  78 + <constraints>
  79 + <constraint firstAttribute="width" constant="56" id="l8Q-On-RNy"/>
  80 + </constraints>
  81 + <state key="normal" backgroundImage="arrow_down"/>
  82 + <connections>
  83 + <action selector="clickShowGrp:" destination="-1" eventType="touchUpInside" id="yfd-Yu-fTF"/>
  84 + </connections>
  85 + </button>
  86 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No group" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xXv-SO-m4h">
  87 + <rect key="frame" x="5" y="0.0" width="284" height="36"/>
  88 + <fontDescription key="fontDescription" type="system" pointSize="15"/>
  89 + <nil key="textColor"/>
  90 + <nil key="highlightedColor"/>
  91 + </label>
  92 + </subviews>
  93 + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  94 + <constraints>
  95 + <constraint firstAttribute="trailing" secondItem="MvK-5R-njL" secondAttribute="trailing" id="IS8-5J-ypb"/>
  96 + <constraint firstAttribute="bottom" secondItem="MvK-5R-njL" secondAttribute="bottom" id="IVS-f9-RjH"/>
  97 + <constraint firstAttribute="bottom" secondItem="xXv-SO-m4h" secondAttribute="bottom" id="Ino-7v-CKz"/>
  98 + <constraint firstItem="MvK-5R-njL" firstAttribute="top" secondItem="hhh-nO-yn5" secondAttribute="top" id="NlH-tz-ByC"/>
  99 + <constraint firstAttribute="height" constant="36" id="O8T-vH-tg6"/>
  100 + <constraint firstItem="MvK-5R-njL" firstAttribute="leading" secondItem="xXv-SO-m4h" secondAttribute="trailing" id="V51-fg-KCf"/>
  101 + <constraint firstItem="xXv-SO-m4h" firstAttribute="leading" secondItem="hhh-nO-yn5" secondAttribute="leading" constant="5" id="eY6-uq-qWx"/>
  102 + <constraint firstItem="xXv-SO-m4h" firstAttribute="top" secondItem="hhh-nO-yn5" secondAttribute="top" id="l3a-Th-4Kb"/>
  103 + </constraints>
  104 + <userDefinedRuntimeAttributes>
  105 + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
  106 + <integer key="value" value="5"/>
  107 + </userDefinedRuntimeAttribute>
  108 + </userDefinedRuntimeAttributes>
  109 + </view>
  110 + <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SNe-1B-nwV">
  111 + <rect key="frame" x="15" y="105" width="345" height="105"/>
  112 + <subviews>
  113 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="グループ VMAP アメリカルート61完走" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hyY-rU-WJx">
  114 + <rect key="frame" x="8" y="8" width="329" height="20"/>
  115 + <constraints>
  116 + <constraint firstAttribute="height" constant="20" id="dx4-Lw-gRP"/>
  117 + </constraints>
  118 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  119 + <nil key="textColor"/>
  120 + <nil key="highlightedColor"/>
  121 + </label>
  122 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="P1r-ft-imP">
  123 + <rect key="frame" x="8" y="36" width="155" height="61"/>
  124 + <constraints>
  125 + <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="61" id="6m3-4u-yjQ"/>
  126 + <constraint firstAttribute="width" constant="155" id="bJa-4P-B84"/>
  127 + </constraints>
  128 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  129 + <nil key="textColor"/>
  130 + <nil key="highlightedColor"/>
  131 + </label>
  132 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fXA-Zh-ABB" customClass="AutoTransButton">
  133 + <rect key="frame" x="171" y="67" width="166" height="30"/>
  134 + <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
  135 + <constraints>
  136 + <constraint firstAttribute="height" constant="30" id="4bu-TU-hhR"/>
  137 + <constraint firstAttribute="width" constant="166" id="hcm-Nd-TE4"/>
  138 + </constraints>
  139 + <state key="normal" title="VMAP">
  140 + <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  141 + </state>
  142 + <userDefinedRuntimeAttributes>
  143 + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
  144 + <integer key="value" value="10"/>
  145 + </userDefinedRuntimeAttribute>
  146 + </userDefinedRuntimeAttributes>
  147 + </button>
  148 + </subviews>
  149 + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  150 + <constraints>
  151 + <constraint firstItem="P1r-ft-imP" firstAttribute="leading" secondItem="SNe-1B-nwV" secondAttribute="leading" constant="8" id="PCO-gJ-aUC"/>
  152 + <constraint firstItem="P1r-ft-imP" firstAttribute="top" secondItem="hyY-rU-WJx" secondAttribute="bottom" constant="8" id="TFE-rm-YuC"/>
  153 + <constraint firstItem="hyY-rU-WJx" firstAttribute="leading" secondItem="SNe-1B-nwV" secondAttribute="leading" constant="8" id="Urc-sV-0AF"/>
  154 + <constraint firstAttribute="bottom" secondItem="P1r-ft-imP" secondAttribute="bottom" constant="8" id="YYl-bN-XH2"/>
  155 + <constraint firstItem="hyY-rU-WJx" firstAttribute="top" secondItem="SNe-1B-nwV" secondAttribute="top" constant="8" id="a68-ja-X4x"/>
  156 + <constraint firstAttribute="trailing" secondItem="fXA-Zh-ABB" secondAttribute="trailing" constant="8" id="hNz-cE-JQc"/>
  157 + <constraint firstAttribute="trailing" secondItem="hyY-rU-WJx" secondAttribute="trailing" constant="8" id="tHp-Xw-Emj"/>
  158 + <constraint firstAttribute="bottom" secondItem="fXA-Zh-ABB" secondAttribute="bottom" constant="8" id="vRs-Al-kct"/>
  159 + </constraints>
  160 + </view>
  161 + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ftA-wa-19F">
  162 + <rect key="frame" x="15" y="218" width="345" height="40"/>
  163 + <constraints>
  164 + <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="40" id="sns-tn-c0d"/>
  165 + </constraints>
  166 + <fontDescription key="fontDescription" type="system" pointSize="14"/>
  167 + <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  168 + <nil key="highlightedColor"/>
  169 + </label>
  170 + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="eBu-7L-nsx" customClass="AutoTransButton">
  171 + <rect key="frame" x="194" y="268" width="166" height="30"/>
  172 + <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
  173 + <constraints>
  174 + <constraint firstAttribute="width" constant="166" id="Rrn-lf-raV"/>
  175 + <constraint firstAttribute="height" constant="30" id="y2E-RH-aan"/>
  176 + </constraints>
  177 + <state key="normal" title="メンバー">
  178 + <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  179 + </state>
  180 + <userDefinedRuntimeAttributes>
  181 + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
  182 + <integer key="value" value="10"/>
  183 + </userDefinedRuntimeAttribute>
  184 + </userDefinedRuntimeAttributes>
  185 + <connections>
  186 + <action selector="clickSwitch:" destination="-1" eventType="touchUpInside" id="B7a-Hl-IlY"/>
  187 + </connections>
  188 + </button>
  189 + <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="none" rowHeight="100" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="ubS-v9-zCa">
  190 + <rect key="frame" x="0.0" y="313" width="375" height="304"/>
  191 + <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
  192 + <connections>
  193 + <outlet property="dataSource" destination="-1" id="HIG-w5-mXN"/>
  194 + <outlet property="delegate" destination="-1" id="GIa-bX-Av9"/>
  195 + </connections>
  196 + </tableView>
  197 + <tableView hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="35" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="dtD-J5-dze">
  198 + <rect key="frame" x="15" y="91" width="345" height="140"/>
  199 + <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
  200 + <constraints>
  201 + <constraint firstAttribute="height" constant="140" id="CrG-Ni-f6b"/>
  202 + </constraints>
  203 + <connections>
  204 + <outlet property="dataSource" destination="-1" id="2bH-mm-vKH"/>
  205 + <outlet property="delegate" destination="-1" id="9tr-mh-5Ir"/>
  206 + </connections>
  207 + </tableView>
  208 + </subviews>
  209 + <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
  210 + <constraints>
  211 + <constraint firstItem="ftA-wa-19F" firstAttribute="top" secondItem="SNe-1B-nwV" secondAttribute="bottom" constant="8" id="4iN-BW-Eaa"/>
  212 + <constraint firstItem="vxT-xe-7mV" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="5np-jI-7iK"/>
  213 + <constraint firstAttribute="trailing" secondItem="eBu-7L-nsx" secondAttribute="trailing" constant="15" id="AkN-Cv-ULu"/>
  214 + <constraint firstItem="SNe-1B-nwV" firstAttribute="top" secondItem="hhh-nO-yn5" secondAttribute="bottom" constant="15" id="BL0-Cv-jlz"/>
  215 + <constraint firstItem="ubS-v9-zCa" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="Dt8-xl-lI8"/>
  216 + <constraint firstAttribute="trailing" secondItem="SNe-1B-nwV" secondAttribute="trailing" constant="15" id="QiL-ts-ryc"/>
  217 + <constraint firstItem="dtD-J5-dze" firstAttribute="top" secondItem="hhh-nO-yn5" secondAttribute="bottom" constant="1" id="QzJ-aS-NQ0"/>
  218 + <constraint firstItem="SNe-1B-nwV" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="T4b-fq-Gc8"/>
  219 + <constraint firstAttribute="trailing" secondItem="hhh-nO-yn5" secondAttribute="trailing" constant="15" id="YB3-2b-4yx"/>
  220 + <constraint firstAttribute="bottom" secondItem="ubS-v9-zCa" secondAttribute="bottom" constant="50" id="ZNH-0B-rWz"/>
  221 + <constraint firstItem="ftA-wa-19F" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="bnx-K2-jVS"/>
  222 + <constraint firstAttribute="trailing" secondItem="ubS-v9-zCa" secondAttribute="trailing" id="bsK-wi-RYU"/>
  223 + <constraint firstAttribute="trailing" secondItem="vxT-xe-7mV" secondAttribute="trailing" id="eld-fc-V95"/>
  224 + <constraint firstItem="hhh-nO-yn5" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="gDN-Hr-2vm"/>
  225 + <constraint firstItem="vxT-xe-7mV" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="iBy-99-6Ky"/>
  226 + <constraint firstItem="dtD-J5-dze" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="ie5-ll-WkY"/>
  227 + <constraint firstAttribute="trailing" secondItem="ftA-wa-19F" secondAttribute="trailing" constant="15" id="jaz-L9-glj"/>
  228 + <constraint firstItem="eBu-7L-nsx" firstAttribute="top" secondItem="ftA-wa-19F" secondAttribute="bottom" constant="10" id="lF2-iL-Xa6"/>
  229 + <constraint firstItem="ubS-v9-zCa" firstAttribute="top" secondItem="eBu-7L-nsx" secondAttribute="bottom" constant="15" id="ofF-9P-pq9"/>
  230 + <constraint firstItem="hhh-nO-yn5" firstAttribute="top" secondItem="vxT-xe-7mV" secondAttribute="bottom" constant="8" id="qIL-RX-3zl"/>
  231 + <constraint firstAttribute="trailing" secondItem="dtD-J5-dze" secondAttribute="trailing" constant="15" id="uHa-ot-bT0"/>
  232 + </constraints>
  233 + <point key="canvasLocation" x="24.5" y="52.5"/>
  234 + </view>
  235 + </objects>
  236 + <resources>
  237 + <image name="arrow_down" width="28" height="18"/>
  238 + <image name="icon_menu" width="30" height="30"/>
  239 + <image name="today_back_button" width="73" height="37"/>
  240 + </resources>
  241 +</document>
LifeLog/LifeLog/RankingViewController.xib
... ... @@ -34,7 +34,7 @@
34 34 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.rank.title"/>
35 35 </userDefinedRuntimeAttributes>
36 36 </label>
37   - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qPe-ff-jRp">
  37 + <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qPe-ff-jRp">
38 38 <rect key="frame" x="0.0" y="5" width="70" height="36"/>
39 39 <constraints>
40 40 <constraint firstAttribute="width" constant="70" id="bEy-jt-69Q"/>
LifeLog/LifeLog/SNSViewController.m
... ... @@ -14,6 +14,7 @@
14 14 #import "Utilities.h"
15 15  
16 16 #import "SNSRecentTopicTableViewCell.h"
  17 +#import "MyGroupViewController.h"
17 18 #import "SearchGroupViewController.h"
18 19 #import "GroupDetailViewController.h"
19 20  
... ... @@ -46,18 +47,21 @@
46 47 }
47 48  
48 49 - (IBAction)clickMyGroup:(id)sender {
49   -// GroupDetailViewController * detail = [[GroupDetailViewController alloc] init];
50   -// [self.navigationController pushViewController:detail animated:true];
  50 + MyGroupViewController * myGrp = [[MyGroupViewController alloc] init];
  51 + [self.navigationController pushViewController:myGrp animated:true];
51 52 }
52 53  
53 54 #pragma mark UITableView Delegate
54 55 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
55 56 SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"];
56 57 TweetObject *object = [_curDataList objectAtIndex:indexPath.row];
57   - if(object.avatarLink && ![object.avatarLink isKindOfClass:[NSNull class]]) {
58   - [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatarLink]]];
  58 + if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
  59 + [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
59 60 }
60   - cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm"];
  61 + else {
  62 + [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
  63 + }
  64 + cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm" locale:@""];
61 65 cell.lblUsername.text = object.userName;
62 66 cell.lblDes.text = object.content;
63 67 cell.lblMode.text = object.mode;
LifeLog/LifeLog/SNSViewController.xib
... ... @@ -31,7 +31,7 @@
31 31 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.sns.title"/>
32 32 </userDefinedRuntimeAttributes>
33 33 </label>
34   - <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BIE-oM-ejb">
  34 + <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BIE-oM-ejb">
35 35 <rect key="frame" x="0.0" y="5" width="70" height="36"/>
36 36 <constraints>
37 37 <constraint firstAttribute="width" constant="70" id="ZpD-Ru-8wG"/>
LifeLog/LifeLog/SearchGroupViewController.h
... ... @@ -9,7 +9,9 @@
9 9 #import <UIKit/UIKit.h>
10 10 #import "BaseTableViewController.h"
11 11  
12   -@interface SearchGroupViewController : BaseTableViewController<UITextFieldDelegate>
  12 +@interface SearchGroupViewController : BaseTableViewController<UITextFieldDelegate> {
  13 + NSTimer *timerSearch;
  14 +}
13 15  
14 16 @property (weak, nonatomic) IBOutlet UITextField *textFieldSearch;
15 17  
LifeLog/LifeLog/SearchGroupViewController.m
... ... @@ -14,6 +14,7 @@
14 14 #import "Utilities.h"
15 15  
16 16 #import "SearchGroupTableViewCell.h"
  17 +#import "CreateGroupViewController.h"
17 18 #import "GroupDetailViewController.h"
18 19  
19 20 @interface SearchGroupViewController ()
... ... @@ -42,11 +43,18 @@
42 43 }
43 44  
44 45 - (IBAction)clickSearch:(id)sender {
  46 + [self.view endEditing:true];
45 47 [self resetData];
46 48 }
47 49  
48 50 - (IBAction)clickCreateGroup:(id)sender {
49   -
  51 + CreateGroupViewController * create = [[CreateGroupViewController alloc] init];
  52 + create.createGroupSuccess = ^(GroupObject *object){
  53 + GroupDetailViewController * detail = [[GroupDetailViewController alloc] init];
  54 + [detail setGroup:object];
  55 + [self.navigationController pushViewController:detail animated:true];
  56 + };
  57 + [self.navigationController pushViewController:create animated:true];
50 58 }
51 59  
52 60 #pragma mark UITableView Delegate
... ... @@ -56,6 +64,9 @@
56 64 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
57 65 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
58 66 }
  67 + else {
  68 + [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
  69 + }
59 70 cell.lblName.text = object.name;
60 71 return cell;
61 72 }
... ... @@ -71,8 +82,16 @@
71 82 }
72 83  
73 84 #pragma mark UITextField Delegate
  85 +-(BOOL) textFieldShouldReturn:(UITextField *)textField {
  86 + [self.view endEditing:true];
  87 + return true;
  88 +}
  89 +
74 90 -(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
75   - [self resetData];
  91 + if(timerSearch != nil) {
  92 + [timerSearch invalidate];
  93 + }
  94 + timerSearch = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(resetData) userInfo:nil repeats:false];
76 95 return true;
77 96 }
78 97  
LifeLog/LifeLog/SearchGroupViewController.xib
... ... @@ -112,7 +112,7 @@
112 112 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.searchGr.bt.createGr"/>
113 113 </userDefinedRuntimeAttributes>
114 114 <connections>
115   - <action selector="clickCreateGroup:" destination="-1" eventType="touchUpOutside" id="iYI-HB-mhb"/>
  115 + <action selector="clickCreateGroup:" destination="-1" eventType="touchUpInside" id="J9P-5a-SrT"/>
116 116 </connections>
117 117 </button>
118 118 <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="none" rowHeight="70" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="yF3-ZN-ebL">
LifeLog/LifeLog/ServerAPI.h
... ... @@ -30,9 +30,12 @@ extern NSString *const kNotificationToken;
30 30 - (void)requestCreateLog:(int)mode withStep:(int)numStep startDate:(NSString *)startDate endDate:(NSString *)endDate CompletionHandler:(void (^)(NSError *))completion;
31 31  
32 32 #pragma mark - History Screen Function
33   -- (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion;
  33 +- (void) requestHistory:(NSString *)token startDate:(NSDate *)startDate endDate:(NSDate *)endDate CompletionHandler:(void (^)(NSArray *, NSError *)) completion;
34 34 - (void) requestHistoryGraph:(NSString *)token withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryGraphObject *, NSError *)) completion;
35 35 - (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSArray *, NSError *)) completion;
  36 +- (void) requestJoinGroup:(NSString *)token groupID: (int) groupID CompletionHandler:(void (^)(NSError *)) completion;
  37 +-(void) requestCreateGroup:(NSString *)token withGroup:(GroupObject *)group CompletionHandler:(void (^)(GroupObject *, NSError *)) completion;
  38 +- (void) requestGroupList:(NSString *)token CompletionHandler:(void (^)(NSArray *, NSError *)) completion;
36 39  
37 40 #pragma mark - SNS Screen Function
38 41 /*
... ... @@ -41,6 +44,11 @@ extern NSString *const kNotificationToken;
41 44 */
42 45 - (void) requestTweetsList:(NSString *)token groupID: (int) groupID withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion;
43 46 - (void) searchGroup:(NSString *)token withKey:(NSString *)key andPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion;
  47 +
  48 +#pragma mark - Group Function
  49 +- (void) getGroupDetail:(NSString *)token withGroupID:(int)groupID CompletionHandler:(void (^)(GroupObject *, NSError *)) completion;
  50 +- (void) requestMemberList:(NSString *)token groupID: (int) groupID withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion;
  51 +
44 52 #pragma mark - Common API
45 53 - (void)refreshToken: (NSString *)userID CompletionHandler:(void (^)(NSString *, NSError *))completion;
46 54 @end
LifeLog/LifeLog/ServerAPI.m
... ... @@ -7,6 +7,7 @@
7 7 //
8 8  
9 9 #import "ServerAPI.h"
  10 +#import "Utilities.h"
10 11  
11 12 NSString *const kServerAddress = @"http://clover.timesfun.jp:9001/";
12 13 NSString *const kUser = @"KEY_USER";
... ... @@ -406,8 +407,8 @@ NSURLSessionDataTask * searchTask;
406 407 }
407 408  
408 409 #pragma mark - History Screen Function
409   -- (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion {
410   - NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/%@/%d", [self convertIntToString:type], mode];
  410 +- (void) requestHistory:(NSString *)token startDate:(NSDate *)startDate endDate:(NSDate *)endDate CompletionHandler:(void (^)(NSArray *, NSError *)) completion {
  411 + NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/%@/%@", [Utilities stringFromDate:startDate withFormat:@"YYYYMMdd" locale:@""], [Utilities stringFromDate:endDate withFormat:@"YYYYMMdd" locale:@""]];
411 412 NSLog(@"requestHistory link %@", url);
412 413 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
413 414  
... ... @@ -421,8 +422,22 @@ NSURLSessionDataTask * searchTask;
421 422 NSLog(@"%@", dataResult);
422 423 int status = [dataResult[@"status"] intValue];
423 424 if (status == 1) { // status = 1 success
424   - HistoryObject * object = [[HistoryObject alloc] initWithData:dataResult[@"result"]];
425   - completion(object, nil);
  425 + NSMutableArray * arrayHistory = [[NSMutableArray alloc] init];
  426 + NSDictionary * arrResult = dataResult[@"result"];
  427 + if(arrResult != nil) {
  428 + NSArray *arrayKey = [NSArray arrayWithObjects:@"mode_1", @"mode_2", @"mode_3", nil];
  429 + for(NSString * key in arrayKey) {
  430 + NSDictionary *mode = [arrResult objectForKey:key];
  431 + if(mode.count > 0) {
  432 + HistoryObject * objectMode = [[HistoryObject alloc] initWithData:mode];
  433 + [arrayHistory addObject:objectMode];
  434 + }
  435 + else {
  436 + [arrayHistory addObject:[[HistoryObject alloc] init]];
  437 + }
  438 + }
  439 + }
  440 + completion(arrayHistory, nil);
426 441 }
427 442 else {
428 443 NSString *message = dataResult[@"message"];
... ... @@ -433,7 +448,7 @@ NSURLSessionDataTask * searchTask;
433 448 if ([message isEqualToString:@"Token is invalid"]) {
434 449 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
435 450 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
436   - [self requestHistory:tokenNew atDate:date withType:type andMode:mode CompletionHandler:completion];
  451 + [self requestHistory:tokenNew startDate:startDate endDate:endDate CompletionHandler:completion];
437 452 }
438 453 else {
439 454 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
... ... @@ -646,6 +661,265 @@ NSURLSessionDataTask * searchTask;
646 661 }];
647 662 }
648 663  
  664 +#pragma mark - Group Function
  665 +-(void) requestCreateGroup:(NSString *)token withGroup:(GroupObject *)group CompletionHandler:(void (^)(GroupObject *, NSError *)) completion {
  666 + NSString *url = [kServerAddress stringByAppendingFormat:@"api/groups/newGroup"];
  667 + NSLog(@"requestCreateGroup link %@", url);
  668 + NSDictionary * dict = @{@"group_name":group.name,
  669 + @"goal":group.goal,
  670 + @"walk_mode_active":[NSNumber numberWithBool:group.walkMode],
  671 + @"run_mode_active":[NSNumber numberWithBool:group.runMode],
  672 + @"bike_mode_active":[NSNumber numberWithBool:group.bikeMode],
  673 + @"step_mode_active":[NSNumber numberWithBool:group.stepMode],
  674 + @"gym_mode_active":[NSNumber numberWithBool:group.gymMode],
  675 + @"beginer_mode_active":[NSNumber numberWithBool:group.beginMode],
  676 + @"walk_mode_goal":[NSNumber numberWithBool:group.walkGoal],
  677 + @"run_mode_goal":[NSNumber numberWithBool:group.runGoal],
  678 + @"bike_mode_goal":[NSNumber numberWithBool:group.bikeGoal]};
  679 +
  680 + [self _request:url method:@"POST" token:token paras:dict completion:^(NSData *data, NSError *error) {
  681 +
  682 + if (completion == NULL) {
  683 + return ;
  684 + }
  685 +
  686 + if (error == nil)
  687 + {
  688 + NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
  689 + NSLog(@"%@", dataResult);
  690 + int status = [dataResult[@"status"] intValue];
  691 + if (status == 1) { // status = 1 success
  692 + if(dataResult[@"result"] != nil) {
  693 + NSDictionary * dict = dataResult[@"result"];
  694 + group.groupID = [dict[@"group_id"] intValue];
  695 + completion(group, nil);
  696 + }
  697 + else {
  698 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
  699 + completion(nil, errorObject);
  700 + }
  701 + }
  702 + else {
  703 + NSString *message = dataResult[@"message"];
  704 + if (message == nil) {
  705 + message = @"Unknown error";
  706 + }
  707 +
  708 + if ([message isEqualToString:@"Token is invalid"]) {
  709 + [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
  710 + NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
  711 + [self requestCreateGroup:tokenNew withGroup:group CompletionHandler:completion];
  712 + }
  713 + else {
  714 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
  715 + completion(nil, errorObject);
  716 + }
  717 + }
  718 + }
  719 + else
  720 + {
  721 + completion(nil, error);
  722 + }
  723 + }];
  724 +}
  725 +
  726 +- (void) getGroupDetail:(NSString *)token withGroupID:(int)groupID CompletionHandler:(void (^)(GroupObject *, NSError *)) completion {
  727 + NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/detail/%d", groupID];
  728 + NSLog(@"getGroupDetail link %@", url);
  729 + [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
  730 +
  731 + if (completion == NULL) {
  732 + return ;
  733 + }
  734 +
  735 + if (error == nil)
  736 + {
  737 + NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
  738 + NSLog(@"%@", dataResult);
  739 + int status = [dataResult[@"status"] intValue];
  740 + if (status == 1) { // status = 1 success
  741 + if(dataResult[@"result"] != nil) {
  742 + NSArray * array = dataResult[@"result"];
  743 + GroupObject * object = [[GroupObject alloc] initWithData:array[0] andGroupID:groupID];
  744 + completion(object, nil);
  745 + }
  746 + else {
  747 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
  748 + completion(nil, errorObject);
  749 + }
  750 + }
  751 + else {
  752 + NSString *message = dataResult[@"message"];
  753 + if (message == nil) {
  754 + message = @"Unknown error";
  755 + }
  756 +
  757 + if ([message isEqualToString:@"Token is invalid"]) {
  758 + [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
  759 + NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
  760 + [self getGroupDetail:tokenNew withGroupID:groupID CompletionHandler:completion];
  761 + }
  762 + else {
  763 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
  764 + completion(nil, errorObject);
  765 + }
  766 + }
  767 + }
  768 + else
  769 + {
  770 + completion(nil, error);
  771 + }
  772 + }];
  773 +}
  774 +
  775 +- (void) requestMemberList:(NSString *)token groupID: (int) groupID withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion {
  776 + NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/member/%d/%d", groupID, page];
  777 + NSLog(@"requestMemberList link %@ page %d", url, page);
  778 +
  779 + [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
  780 + if (completion == NULL) {
  781 + return ;
  782 + }
  783 +
  784 + if (error == nil)
  785 + {
  786 + NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
  787 + NSLog(@"%@", dataResult);
  788 + int status = [dataResult[@"status"] intValue];
  789 + if (status == 1) { // status = 1 success
  790 + if(dataResult[@"result"] != nil) {
  791 + NSArray * array = dataResult[@"result"];
  792 + NSMutableArray * arrayTweets = [[NSMutableArray alloc] init];
  793 + for(NSDictionary * dict in array) {
  794 + MemberObject * object = [[MemberObject alloc] initWithData:dict];
  795 + [arrayTweets addObject:object];
  796 + }
  797 + completion(arrayTweets, nil);
  798 + }
  799 + else {
  800 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
  801 + completion(nil, errorObject);
  802 + }
  803 + }
  804 + else {
  805 + NSString *message = dataResult[@"message"];
  806 + if (message == nil) {
  807 + message = @"Unknown error";
  808 + }
  809 +
  810 + if ([message isEqualToString:@"Token is invalid"]) {
  811 + [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
  812 + NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
  813 + [self requestMemberList:tokenNew groupID:groupID withPage:page CompletionHandler:completion];
  814 + }
  815 + else {
  816 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
  817 + completion(nil, errorObject);
  818 + }
  819 + }
  820 + }
  821 + else
  822 + {
  823 + completion(nil, error);
  824 + }
  825 + }];
  826 +}
  827 +
  828 +- (void) requestJoinGroup:(NSString *)token groupID: (int) groupID CompletionHandler:(void (^)(NSError *)) completion {
  829 + NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/join"];
  830 + NSLog(@"requestJoinGroup link %@", url);
  831 +
  832 + [self _request:url method:@"POST" token:token paras:@{@"group_id": [NSNumber numberWithInt:groupID]} completion:^(NSData *data, NSError *error) {
  833 + if (completion == NULL) {
  834 + return ;
  835 + }
  836 +
  837 + if (error == nil)
  838 + {
  839 + NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
  840 + NSLog(@"%@", dataResult);
  841 + int status = [dataResult[@"status"] intValue];
  842 + if (status == 1) { // status = 1 success
  843 + if(dataResult[@"result"] != nil) {
  844 + completion(nil);
  845 + }
  846 + else {
  847 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
  848 + completion(errorObject);
  849 + }
  850 + }
  851 + else {
  852 + NSString *message = dataResult[@"message"];
  853 + if ([message isEqualToString:@"Token is invalid"]) {
  854 + [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
  855 + NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
  856 + [self requestJoinGroup:tokenNew groupID:groupID CompletionHandler:completion];
  857 + }
  858 + else {
  859 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
  860 + completion(errorObject);
  861 + }
  862 + }
  863 + }
  864 + else
  865 + {
  866 + completion(error);
  867 + }
  868 + }];
  869 +}
  870 +
  871 +- (void) requestGroupList:(NSString *)token CompletionHandler:(void (^)(NSArray *, NSError *)) completion {
  872 + NSString *url = [kServerAddress stringByAppendingFormat:@"api/groups/list"];
  873 + NSLog(@"requestGroupList link %@", url);
  874 +
  875 + [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
  876 + if (completion == NULL) {
  877 + return ;
  878 + }
  879 +
  880 + if (error == nil)
  881 + {
  882 + NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
  883 + NSLog(@"%@", dataResult);
  884 + int status = [dataResult[@"status"] intValue];
  885 + if (status == 1) { // status = 1 success
  886 + if(dataResult[@"result"] != nil) {
  887 + NSArray * array = dataResult[@"result"];
  888 + NSMutableArray * arrayGroup = [[NSMutableArray alloc] init];
  889 + for(NSDictionary * dict in array) {
  890 + GroupObject * object = [[GroupObject alloc] initWithShortData:dict];
  891 + [arrayGroup addObject:object];
  892 + }
  893 + completion(arrayGroup, nil);
  894 + }
  895 + else {
  896 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
  897 + completion(nil, errorObject);
  898 + }
  899 + }
  900 + else {
  901 + NSString *message = dataResult[@"message"];
  902 + if (message == nil) {
  903 + message = @"Unknown error";
  904 + }
  905 +
  906 + if ([message isEqualToString:@"Token is invalid"]) {
  907 + [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
  908 + NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
  909 + [self requestGroupList:tokenNew CompletionHandler:completion];
  910 + }
  911 + else {
  912 + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
  913 + completion(nil, errorObject);
  914 + }
  915 + }
  916 + }
  917 + else
  918 + {
  919 + completion(nil, error);
  920 + }
  921 + }];
  922 +}
649 923 #pragma mark - Common API
650 924 - (void)refreshToken: (NSString *)userID CompletionHandler:(void (^)(NSString *, NSError *))completion {
651 925 [self _request:[kServerAddress stringByAppendingFormat: @"refreshToken"] method:@"POST" token:@"" paras:@{@"userId":userID} completion:^(NSData *data, NSError *error) {
LifeLog/LifeLog/TweetObject.h
... ... @@ -19,7 +19,7 @@
19 19 @property (nonatomic, strong) NSString * mode;
20 20 @property (nonatomic, strong) NSString * time;
21 21 @property (nonatomic, strong) NSString * userName;
22   -@property (nonatomic, strong) NSString * avatarLink;
  22 +@property (nonatomic, strong) NSString * avatar;
23 23 @property (nonatomic, strong) NSDate * createDate;
24 24  
25 25 -(id) initWithData : (NSDictionary *) dict;
LifeLog/LifeLog/TweetObject.m
... ... @@ -54,7 +54,7 @@
54 54 self.userName = dict[@"full_name"];
55 55 }
56 56 if([dict objectForKey:@"profile_image"] != nil) {
57   - self.avatarLink = dict[@"profile_image"];
  57 + self.avatar = dict[@"profile_image"];
58 58 }
59 59 if([dict objectForKey:@"created_at"] != nil) {
60 60 NSString *dateString = dict[@"created_at"];
LifeLog/LifeLog/Utilities.h
... ... @@ -12,6 +12,7 @@
12 12 @interface Utilities : NSObject
13 13 + (NSString *)addCommaFromNumber:(NSInteger)number;
14 14 + (UIColor *)convertHecToColor:(int) hex;
  15 ++ (void)showMessage:(NSString *)message withViewController:(UIViewController *)vc;
15 16 + (void)showErrorMessage:(NSString *)message withViewController:(UIViewController *)vc;
16 17 + (NSString *) getImageLink : (NSString *) path;
17 18  
... ... @@ -23,5 +24,5 @@
23 24  
24 25 //convert date time
25 26 + (NSDate *) dateFromString : (NSString *) dateString withFormat: (NSString *) format;
26   -+ (NSString *) stringFromDate : (NSDate *) date withFormat: (NSString *) format;
  27 ++ (NSString *) stringFromDate : (NSDate *) date withFormat: (NSString *) format locale:(NSString *) locale;
27 28 @end
LifeLog/LifeLog/Utilities.m
... ... @@ -29,6 +29,28 @@
29 29 blue:((float)(hex & 0xFF))/255.0 alpha:1.0];
30 30 }
31 31  
  32 ++ (void)showMessage:(NSString *)message withViewController:(UIViewController *)vc
  33 +{
  34 + if (message.length > 0) {
  35 + UIAlertController * alert= [UIAlertController
  36 + alertControllerWithTitle:@"Message"
  37 + message:message
  38 + preferredStyle:UIAlertControllerStyleAlert];
  39 +
  40 + UIAlertAction* ok = [UIAlertAction
  41 + actionWithTitle:@"OK"
  42 + style:UIAlertActionStyleDefault
  43 + handler:^(UIAlertAction * action)
  44 + {
  45 + [alert dismissViewControllerAnimated:YES completion:nil];
  46 + }];
  47 +
  48 + [alert addAction:ok];
  49 +
  50 + [vc presentViewController:alert animated:YES completion:nil];
  51 + }
  52 +}
  53 +
32 54 + (void)showErrorMessage:(NSString *)message withViewController:(UIViewController *)vc
33 55 {
34 56 if (message.length > 0) {
... ... @@ -43,7 +65,6 @@
43 65 handler:^(UIAlertAction * action)
44 66 {
45 67 [alert dismissViewControllerAnimated:YES completion:nil];
46   -
47 68 }];
48 69  
49 70 [alert addAction:ok];
... ... @@ -136,9 +157,12 @@
136 157 return date;
137 158 }
138 159  
139   -+ (NSString *) stringFromDate : (NSDate *) date withFormat: (NSString *) format {
  160 ++ (NSString *) stringFromDate : (NSDate *) date withFormat: (NSString *) format locale:(NSString *) locale {
140 161 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
141 162 [dateFormat setDateFormat:format];
  163 + if(![locale isEqual: @""]) {
  164 + [dateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:locale]];
  165 + }
142 166 NSString *dateString = [dateFormat stringFromDate:date];
143 167 return dateString;
144 168 }