diff --git a/iOS/MonsterCards.xcodeproj/project.pbxproj b/iOS/MonsterCards.xcodeproj/project.pbxproj index a23971e..1321278 100644 --- a/iOS/MonsterCards.xcodeproj/project.pbxproj +++ b/iOS/MonsterCards.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 1D2A61B332F293AB365B59E7 /* Pods_MonsterCards_MonsterCardsUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89F0D2EC2EC3C99EFD9A6949 /* Pods_MonsterCards_MonsterCardsUITests.framework */; }; 92967C3D4DFE1D9C66FF994F /* Pods_MonsterCards.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA8D56491D6CAB92316D2C1B /* Pods_MonsterCards.framework */; }; CE281520762D69A9E98D19CF /* Pods_MonsterCardsTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F017069E22ED575758F9E2 /* Pods_MonsterCardsTests.framework */; }; + E20C315425146708003AB1AA /* MCIntegerFieldTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E20C315325146708003AB1AA /* MCIntegerFieldTableViewCell.m */; }; E20D032425031B9D00FB6E43 /* SearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E20D032325031B9D00FB6E43 /* SearchViewController.m */; }; E20D032825031BDA00FB6E43 /* MonsterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E20D032725031BDA00FB6E43 /* MonsterViewController.m */; }; E20D032B25031BE500FB6E43 /* LibraryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E20D032A25031BE500FB6E43 /* LibraryViewController.m */; }; @@ -28,8 +29,9 @@ E25BD60725036CFA007B04EF /* Action.m in Sources */ = {isa = PBXBuildFile; fileRef = E25BD60625036CFA007B04EF /* Action.m */; }; E26A73572511BA1900C5677E /* HTMLHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E26A73562511BA1900C5677E /* HTMLHelper.m */; }; E278E21B250DFFCA00D3EC0E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E278E21A250DFFCA00D3EC0E /* Images.xcassets */; }; + E288744A25148BA0005CA948 /* MCFormFieldConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = E288744925148BA0005CA948 /* MCFormFieldConstants.m */; }; E2D3E3B0250827110052A8EC /* EditMonsterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E2D3E3AF250827110052A8EC /* EditMonsterViewController.m */; }; - E2D3E3B42508C3360052A8EC /* EditableShortStringTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E2D3E3B32508C3360052A8EC /* EditableShortStringTableViewCell.m */; }; + E2D3E3B42508C3360052A8EC /* MCShortStringFieldTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E2D3E3B32508C3360052A8EC /* MCShortStringFieldTableViewCell.m */; }; E2E25805250CC3A7002E7308 /* MonsterCards.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = E2F7248225005E89007D87ED /* MonsterCards.xcdatamodeld */; }; E2ECA8F32504AC3300C1FFA5 /* SkillTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E2ECA8F22504AC3300C1FFA5 /* SkillTests.m */; }; E2ECA8F52504BAAD00C1FFA5 /* MonsterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E2ECA8F42504BAAD00C1FFA5 /* MonsterTests.m */; }; @@ -74,6 +76,8 @@ A7E1FCC69D4538591C4D289B /* Pods-MonsterCards.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MonsterCards.debug.xcconfig"; path = "Target Support Files/Pods-MonsterCards/Pods-MonsterCards.debug.xcconfig"; sourceTree = ""; }; A9F017069E22ED575758F9E2 /* Pods_MonsterCardsTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MonsterCardsTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D079B8CF0ADA838AAA0A13EA /* Pods-MonsterCards.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MonsterCards.release.xcconfig"; path = "Target Support Files/Pods-MonsterCards/Pods-MonsterCards.release.xcconfig"; sourceTree = ""; }; + E20C315225146708003AB1AA /* MCIntegerFieldTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCIntegerFieldTableViewCell.h; sourceTree = ""; }; + E20C315325146708003AB1AA /* MCIntegerFieldTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MCIntegerFieldTableViewCell.m; sourceTree = ""; }; E20D032225031B9D00FB6E43 /* SearchViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SearchViewController.h; sourceTree = ""; }; E20D032325031B9D00FB6E43 /* SearchViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SearchViewController.m; sourceTree = ""; }; E20D032625031BDA00FB6E43 /* MonsterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MonsterViewController.h; sourceTree = ""; }; @@ -89,7 +93,7 @@ E22F837E2511E8500072105C /* JSONHelperTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JSONHelperTests.m; sourceTree = ""; }; E2532E8725038DE100CA4CBA /* StringHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StringHelper.h; sourceTree = ""; }; E2532E8825038DE100CA4CBA /* StringHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StringHelper.m; sourceTree = ""; }; - E2591EB62509DD4900B396FD /* EditableFormFieldDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EditableFormFieldDelegate.h; sourceTree = ""; }; + E2591EB62509DD4900B396FD /* MCFormFieldDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCFormFieldDelegate.h; sourceTree = ""; }; E2592B8C250D6B8100906A40 /* EditMonsterViewControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EditMonsterViewControllerTests.m; sourceTree = ""; }; E25BD5F3250352C4007B04EF /* Monster.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Monster.h; sourceTree = ""; }; E25BD5F4250352C4007B04EF /* Monster.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Monster.m; sourceTree = ""; }; @@ -109,10 +113,12 @@ E26A73552511BA1900C5677E /* HTMLHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLHelper.h; sourceTree = ""; }; E26A73562511BA1900C5677E /* HTMLHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLHelper.m; sourceTree = ""; }; E278E21A250DFFCA00D3EC0E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + E288744925148BA0005CA948 /* MCFormFieldConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MCFormFieldConstants.m; sourceTree = ""; }; + E288744E25148BAD005CA948 /* MCFormFieldConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCFormFieldConstants.h; sourceTree = ""; }; E2D3E3AE250827110052A8EC /* EditMonsterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EditMonsterViewController.h; sourceTree = ""; }; E2D3E3AF250827110052A8EC /* EditMonsterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EditMonsterViewController.m; sourceTree = ""; }; - E2D3E3B22508C3360052A8EC /* EditableShortStringTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EditableShortStringTableViewCell.h; sourceTree = ""; }; - E2D3E3B32508C3360052A8EC /* EditableShortStringTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EditableShortStringTableViewCell.m; sourceTree = ""; }; + E2D3E3B22508C3360052A8EC /* MCShortStringFieldTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCShortStringFieldTableViewCell.h; sourceTree = ""; }; + E2D3E3B32508C3360052A8EC /* MCShortStringFieldTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MCShortStringFieldTableViewCell.m; sourceTree = ""; }; E2ECA8F22504AC3300C1FFA5 /* SkillTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SkillTests.m; sourceTree = ""; }; E2ECA8F42504BAAD00C1FFA5 /* MonsterTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MonsterTests.m; sourceTree = ""; }; E2F7247025005E89007D87ED /* Monster Cards.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Monster Cards.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -264,9 +270,13 @@ E2D3E3B12508C2FE0052A8EC /* FormFields */ = { isa = PBXGroup; children = ( - E2D3E3B22508C3360052A8EC /* EditableShortStringTableViewCell.h */, - E2D3E3B32508C3360052A8EC /* EditableShortStringTableViewCell.m */, - E2591EB62509DD4900B396FD /* EditableFormFieldDelegate.h */, + E2591EB62509DD4900B396FD /* MCFormFieldDelegate.h */, + E288744E25148BAD005CA948 /* MCFormFieldConstants.h */, + E288744925148BA0005CA948 /* MCFormFieldConstants.m */, + E20C315225146708003AB1AA /* MCIntegerFieldTableViewCell.h */, + E20C315325146708003AB1AA /* MCIntegerFieldTableViewCell.m */, + E2D3E3B22508C3360052A8EC /* MCShortStringFieldTableViewCell.h */, + E2D3E3B32508C3360052A8EC /* MCShortStringFieldTableViewCell.m */, ); path = FormFields; sourceTree = ""; @@ -592,11 +602,13 @@ E20D032825031BDA00FB6E43 /* MonsterViewController.m in Sources */, E25BD60725036CFA007B04EF /* Action.m in Sources */, E2D3E3B0250827110052A8EC /* EditMonsterViewController.m in Sources */, + E288744A25148BA0005CA948 /* MCFormFieldConstants.m in Sources */, E2F7247525005E89007D87ED /* AppDelegate.m in Sources */, - E2D3E3B42508C3360052A8EC /* EditableShortStringTableViewCell.m in Sources */, + E2D3E3B42508C3360052A8EC /* MCShortStringFieldTableViewCell.m in Sources */, E20D032B25031BE500FB6E43 /* LibraryViewController.m in Sources */, E20D033125031BFD00FB6E43 /* DashboardViewController.m in Sources */, E25BD5FE25036A76007B04EF /* DamageType.m in Sources */, + E20C315425146708003AB1AA /* MCIntegerFieldTableViewCell.m in Sources */, E2F7248425005E89007D87ED /* MonsterCards.xcdatamodeld in Sources */, E25BD60425036CF0007B04EF /* Ability.m in Sources */, E20D032E25031BEF00FB6E43 /* CollectionsViewController.m in Sources */, diff --git a/iOS/MonsterCards/Base.lproj/Main.storyboard b/iOS/MonsterCards/Base.lproj/Main.storyboard index 5462e72..06280bb 100644 --- a/iOS/MonsterCards/Base.lproj/Main.storyboard +++ b/iOS/MonsterCards/Base.lproj/Main.storyboard @@ -1,9 +1,11 @@ - + - + + + @@ -34,8 +36,8 @@ - + @@ -50,8 +52,8 @@ - + @@ -66,7 +68,7 @@ - + @@ -149,7 +151,7 @@ - + @@ -194,7 +196,7 @@ @@ -210,7 +212,8 @@ - + + @@ -222,7 +225,6 @@ - @@ -250,43 +252,91 @@ - + - - + + - - + + - - + + + + + + + + + + + + + + + + + + - - - - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - @@ -314,11 +364,17 @@ - + + + + + + + diff --git a/iOS/MonsterCards/Views/EditMonsterViewController.h b/iOS/MonsterCards/Views/EditMonsterViewController.h index cd799f9..2e2496a 100644 --- a/iOS/MonsterCards/Views/EditMonsterViewController.h +++ b/iOS/MonsterCards/Views/EditMonsterViewController.h @@ -8,11 +8,11 @@ #import #import "Monster.h" -#import "EditableShortStringTableViewCell.h" +#import "MCShortStringFieldTableViewCell.h" NS_ASSUME_NONNULL_BEGIN -@interface EditMonsterViewController : UIViewController +@interface EditMonsterViewController : UIViewController @property Monster* originalMonster; @property (weak, nonatomic) IBOutlet UITableView *monsterTableView; diff --git a/iOS/MonsterCards/Views/EditMonsterViewController.m b/iOS/MonsterCards/Views/EditMonsterViewController.m index ee58ef1..a4bd1eb 100644 --- a/iOS/MonsterCards/Views/EditMonsterViewController.m +++ b/iOS/MonsterCards/Views/EditMonsterViewController.m @@ -7,7 +7,8 @@ // #import "EditMonsterViewController.h" -#import "EditableShortStringTableViewCell.h" +#import "MCShortStringFieldTableViewCell.h" +#import "MCIntegerFieldTableViewCell.h" #import "AppDelegate.h" @interface EditMonsterViewController () @@ -16,6 +17,9 @@ @end +const int kSectionIndexBasicInfo = 0; +const int kSectionIndexAbilityScores = 1; + @implementation EditMonsterViewController { NSManagedObjectContext *_context; } @@ -34,6 +38,24 @@ self.editingMonster = [[Monster alloc] initWithMonster:self.originalMonster]; } +- (MCShortStringFieldTableViewCell*) makeShortStringCellFromCell:(UITableViewCell*)cell { + if (cell == nil || ![cell isKindOfClass:[MCShortStringFieldTableViewCell class]]) { + // TODO: Figure out how to make this cell generate child views. + return [[MCShortStringFieldTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MCShortStringField"]; + } else { + return (MCShortStringFieldTableViewCell*)cell; + } +} + +- (MCIntegerFieldTableViewCell*) makeIntegerCellFromCell:(UITableViewCell*)cell { + if (cell == nil || ![cell isKindOfClass:[MCIntegerFieldTableViewCell class]]) { + // TODO: Figure out how to make this cell generate child views. + return [[MCIntegerFieldTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MCIntegerField"]; + } else { + return (MCIntegerFieldTableViewCell*)cell; + } +} + #pragma mark - Navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { @@ -52,65 +74,80 @@ #pragma mark - UITableViewDataSource - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section { - // Section 0 is basic info - // * Name - // * Size - // * Type - // * Subtype - // * Alignment - - return 5; + switch(section) { + case kSectionIndexBasicInfo: + // Section 0 is basic info + // * Name + // * Size + // * Type + // * Subtype + // * Alignment + return 5; + case kSectionIndexAbilityScores: + return 0; + default: + return 0; + } } -- (EditableShortStringTableViewCell*) makeShortStringCellFromCell:(UITableViewCell*)cell { - if (cell == nil || ![cell isKindOfClass:[EditableShortStringTableViewCell class]]) { - // TODO: Figure out why this doesn't create a cell with a text field. - return [[EditableShortStringTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"EditableShortString"]; - } else { - return (EditableShortStringTableViewCell*)cell; +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 2; +} + +- (NSString *)tableView:(UITableView *)tableView +titleForHeaderInSection:(NSInteger)section { + switch(section) { + case kSectionIndexBasicInfo: + return NSLocalizedString(@"Basic Info", @"Section title"); + case kSectionIndexAbilityScores: + return NSLocalizedString(@"Ability Scores", @"Section title"); + default: + return nil; } } - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { - EditableShortStringTableViewCell *shortStringCell = nil; + MCShortStringFieldTableViewCell *shortStringCell = nil; + MCIntegerFieldTableViewCell *integerCell = nil; switch (indexPath.section) { - case 0: + case kSectionIndexBasicInfo: switch (indexPath.row) { case 0: - shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"EditableShortString"]]; + shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"MCShortStringField"]]; shortStringCell.delegate = self; shortStringCell.identifier = @"monster.name"; - // TODO: make these use setters on EditableShortStringTableViewCell + // TODO: make these use setters on MCShortStringFieldTableViewCell shortStringCell.textField.text = self.editingMonster.name; shortStringCell.textField.placeholder = NSLocalizedString(@"Name", @"Placeholder text for the name of a monster or NPC."); return shortStringCell; case 1: - shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"EditableShortString"]]; + shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"MCShortStringField"]]; shortStringCell.delegate = self; shortStringCell.identifier = @"monster.size"; - // TODO: make these use setters on EditableShortStringTableViewCell + // TODO: make these use setters on MCShortStringFieldTableViewCell shortStringCell.textField.text = self.editingMonster.size; shortStringCell.textField.placeholder = NSLocalizedString(@"Size", @"Placehodler text for the size of a monster or NPC."); return shortStringCell; case 2: - shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"EditableShortString"]]; + shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"MCShortStringField"]]; shortStringCell.delegate = self; shortStringCell.identifier = @"monster.type"; - // TODO: make these use setters on EditableShortStringTableViewCell + // TODO: make these use setters on MCShortStringFieldTableViewCell shortStringCell.textField.text = self.editingMonster.type; shortStringCell.textField.placeholder = NSLocalizedString(@"Type", @"Placehodler text for the type of a monster or NPC."); return shortStringCell; case 3: - shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"EditableShortString"]]; + shortStringCell = [self makeShortStringCellFromCell:[self.monsterTableView dequeueReusableCellWithIdentifier:@"MCShortStringField"]]; shortStringCell.delegate = self; shortStringCell.identifier = @"monster.subtype"; shortStringCell.textField.text = self.editingMonster.subtype; shortStringCell.textField.placeholder = NSLocalizedString(@"Subtype", @"Placeholder text for the subtype of a monster or NPC."); return shortStringCell; case 4: - shortStringCell = [self makeShortStringCellFromCell: [self.monsterTableView dequeueReusableCellWithIdentifier:@"EditableShortString"]]; + shortStringCell = [self makeShortStringCellFromCell: [self.monsterTableView dequeueReusableCellWithIdentifier:@"MCShortStringField"]]; shortStringCell.delegate = self; shortStringCell.identifier = @"monster.alignment"; shortStringCell.textField.text = self.editingMonster.alignment; @@ -120,13 +157,18 @@ break; } +#if DEBUG + NSLog(@"ERROR: Unable to build a cell for %@", indexPath); return nil; +#else + return [[UITableViewCell alloc] init]; +#endif } -#pragma mark - EditableShortStringDelegate +#pragma mark - MCShortStringFieldDelegate - (void)editableValueDidChange:(NSObject*)value forIdentifier:(NSString*)identifier andType:(NSString*)type { - if ([@"String" isEqualToString:type]) { + if ([kMCFieldValueTypeString isEqualToString:type]) { if ([@"monster.name" isEqualToString:identifier]) { self.editingMonster.name = (NSString*)value; } else if ([@"monster.size" isEqualToString:identifier]) { @@ -139,6 +181,11 @@ self.editingMonster.alignment = (NSString*)value; } } + if ([kMCFieldValueTypeInteger isEqualToString:type]) { + if ([@"monster.strengthScore" isEqualToString:identifier]) { + self.editingMonster.strengthScore = [(NSNumber*)value intValue]; + } + } } @end diff --git a/iOS/MonsterCards/Views/FormFields/EditableShortStringTableViewCell.m b/iOS/MonsterCards/Views/FormFields/EditableShortStringTableViewCell.m deleted file mode 100644 index df30060..0000000 --- a/iOS/MonsterCards/Views/FormFields/EditableShortStringTableViewCell.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// EditableShortStringTableViewCell.m -// MonsterCards -// -// Created by Tom Hicks on 9/9/20. -// Copyright © 2020 Tom Hicks. All rights reserved. -// - -#import "EditableShortStringTableViewCell.h" - -@implementation EditableShortStringTableViewCell - -- (void)awakeFromNib { - [super awakeFromNib]; - // Initialization code - self.textField.delegate = self; -} - -#pragma mark - UITextFieldDelegate - -- (BOOL)textField:(UITextField *)textField -shouldChangeCharactersInRange:(NSRange)range -replacementString:(NSString *)string { - // TODO: See this link for a potentially better way to get this text https://stackoverflow.com/questions/19110617/uitextfieldtextdidchangenotification-ios7-not-fired - NSString *finalString = [textField.text stringByReplacingCharactersInRange:range withString:string]; - if (self.delegate != nil) { - [self.delegate editableValueDidChange:finalString forIdentifier:self.identifier andType:@"String"]; - } - return YES; -} - -@end diff --git a/iOS/MonsterCards/Views/FormFields/MCFormFieldConstants.h b/iOS/MonsterCards/Views/FormFields/MCFormFieldConstants.h new file mode 100644 index 0000000..d5dbd0f --- /dev/null +++ b/iOS/MonsterCards/Views/FormFields/MCFormFieldConstants.h @@ -0,0 +1,15 @@ +// +// MCFormFieldConstants.h +// MonsterCards +// +// Created by Tom Hicks on 9/17/20. +// Copyright © 2020 Tom Hicks. All rights reserved. +// + +#ifndef MCFormFieldConstants_h +#define MCFormFieldConstants_h + +extern NSString* const kMCFieldValueTypeInteger; +extern NSString* const kMCFieldValueTypeString; + +#endif /* MCFormFieldConstants_h */ diff --git a/iOS/MonsterCards/Views/FormFields/MCFormFieldConstants.m b/iOS/MonsterCards/Views/FormFields/MCFormFieldConstants.m new file mode 100644 index 0000000..809a712 --- /dev/null +++ b/iOS/MonsterCards/Views/FormFields/MCFormFieldConstants.m @@ -0,0 +1,13 @@ +// +// MCFormFieldConstants.m +// MonsterCards +// +// Created by Tom Hicks on 9/17/20. +// Copyright © 2020 Tom Hicks. All rights reserved. +// + +#import +#import "MCFormFieldConstants.h" + +NSString* const kMCFieldValueTypeInteger = @"Integer"; +NSString* const kMCFieldValueTypeString = @"String"; diff --git a/iOS/MonsterCards/Views/FormFields/EditableFormFieldDelegate.h b/iOS/MonsterCards/Views/FormFields/MCFormFieldDelegate.h similarity index 55% rename from iOS/MonsterCards/Views/FormFields/EditableFormFieldDelegate.h rename to iOS/MonsterCards/Views/FormFields/MCFormFieldDelegate.h index 877a3a1..6fae47c 100644 --- a/iOS/MonsterCards/Views/FormFields/EditableFormFieldDelegate.h +++ b/iOS/MonsterCards/Views/FormFields/MCFormFieldDelegate.h @@ -1,15 +1,17 @@ // -// EditableFormFieldDelegate.h +// MCFormFieldDelegate.h // MonsterCards // // Created by Tom Hicks on 9/9/20. // Copyright © 2020 Tom Hicks. All rights reserved. // -#ifndef EditableFormFieldDelegate_h -#define EditableFormFieldDelegate_h +#ifndef MCFormFieldDelegate_h +#define MCFormFieldDelegate_h -@protocol EditableFormFieldDelegate +#import "MCFormFieldConstants.h" + +@protocol MCFormFieldDelegate @optional -(void)editableValueDidChange:(NSObject*)value forIdentifier:(NSString*)identifier andType:(NSString*)type; @@ -17,4 +19,4 @@ @end -#endif /* EditableFormFieldDelegate_h */ +#endif /* MCFormFieldDelegate_h */ diff --git a/iOS/MonsterCards/Views/FormFields/MCIntegerFieldTableViewCell.h b/iOS/MonsterCards/Views/FormFields/MCIntegerFieldTableViewCell.h new file mode 100644 index 0000000..a57ef3e --- /dev/null +++ b/iOS/MonsterCards/Views/FormFields/MCIntegerFieldTableViewCell.h @@ -0,0 +1,27 @@ +// +// MCIntegerFieldTableViewCell.h +// MonsterCards +// +// Created by Tom Hicks on 9/17/20. +// Copyright © 2020 Tom Hicks. All rights reserved. +// + +#import +#import "MCFormFieldDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MCIntegerFieldTableViewCell : UITableViewCell + +@property NSString* identifier; +@property NSString* label; +@property int value; + +@property (weak, nonatomic) id delegate; +@property (weak, nonatomic) IBOutlet UITextField *textField; +@property (weak, nonatomic) IBOutlet UIStepper *stepper; +- (IBAction)stepperValueChanged:(id)sender; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iOS/MonsterCards/Views/FormFields/MCIntegerFieldTableViewCell.m b/iOS/MonsterCards/Views/FormFields/MCIntegerFieldTableViewCell.m new file mode 100644 index 0000000..6e6c18e --- /dev/null +++ b/iOS/MonsterCards/Views/FormFields/MCIntegerFieldTableViewCell.m @@ -0,0 +1,51 @@ +// +// MCIntegerFieldTableViewCell.m +// MonsterCards +// +// Created by Tom Hicks on 9/17/20. +// Copyright © 2020 Tom Hicks. All rights reserved. +// + +#import "MCIntegerFieldTableViewCell.h" + +@implementation MCIntegerFieldTableViewCell + +@synthesize value = _value; + +-(void) setValue:(int)number { + if (_value != number) { + NSNumber *newValue = [NSNumber numberWithInt:number]; + _value = number; + if (self.textField) { + self.textField.text = [newValue stringValue]; + } + if (self.stepper) { + self.stepper.value = number; + } + if (self.delegate) { + [self.delegate editableValueDidChange:newValue + forIdentifier:self.identifier + andType:kMCFieldValueTypeInteger]; + } + } +} + +- (int) value { + return _value; +} + +- (void)awakeFromNib { + [super awakeFromNib]; + [self.textField addTarget:self + action:@selector(textFieldValueChanged:) + forControlEvents:UIControlEventEditingChanged]; +} + +- (void)textFieldValueChanged:(UITextField*)textField { + self.value = [textField.text intValue]; +} + +- (IBAction)stepperValueChanged:(id)sender { + self.value = self.stepper.value; +} +@end diff --git a/iOS/MonsterCards/Views/FormFields/EditableShortStringTableViewCell.h b/iOS/MonsterCards/Views/FormFields/MCShortStringFieldTableViewCell.h similarity index 53% rename from iOS/MonsterCards/Views/FormFields/EditableShortStringTableViewCell.h rename to iOS/MonsterCards/Views/FormFields/MCShortStringFieldTableViewCell.h index a607709..894bcd8 100644 --- a/iOS/MonsterCards/Views/FormFields/EditableShortStringTableViewCell.h +++ b/iOS/MonsterCards/Views/FormFields/MCShortStringFieldTableViewCell.h @@ -7,22 +7,17 @@ // #import +#import "MCFormFieldDelegate.h" NS_ASSUME_NONNULL_BEGIN -@protocol EditableShortStringDelegate - -@optional --(void)editableValueDidChange:(NSString*)value forIdentifier:(NSString*)identifier andType:(NSString*)type; - -@end - -@interface EditableShortStringTableViewCell : UITableViewCell +@interface MCShortStringFieldTableViewCell : UITableViewCell @property NSString* identifier; @property NSString* label; @property NSString* value; -@property (nonatomic, weak) id delegate; + +@property (weak, nonatomic) id delegate; @property (weak, nonatomic) IBOutlet UITextField *textField; @end diff --git a/iOS/MonsterCards/Views/FormFields/MCShortStringFieldTableViewCell.m b/iOS/MonsterCards/Views/FormFields/MCShortStringFieldTableViewCell.m new file mode 100644 index 0000000..c0adf26 --- /dev/null +++ b/iOS/MonsterCards/Views/FormFields/MCShortStringFieldTableViewCell.m @@ -0,0 +1,27 @@ +// +// EditableShortStringTableViewCell.m +// MonsterCards +// +// Created by Tom Hicks on 9/9/20. +// Copyright © 2020 Tom Hicks. All rights reserved. +// + +#import "MCShortStringFieldTableViewCell.h" + +@implementation MCShortStringFieldTableViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + [self.textField addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventEditingChanged]; +} + +- (void)valueChanged:(UITextField*)textField { + NSString *newValue = textField.text; + if (self.delegate != nil) { + [self.delegate editableValueDidChange:newValue + forIdentifier:self.identifier + andType:kMCFieldValueTypeString]; + } +} + +@end