aboutsummaryrefslogtreecommitdiffstats
path: root/iBean
diff options
context:
space:
mode:
Diffstat (limited to 'iBean')
-rw-r--r--iBean/iBean.xcodeproj/project.pbxproj58
-rw-r--r--iBean/iBean.xcodeproj/project.xcworkspace/xcuserdata/eddiex.xcuserdatad/UserInterfaceState.xcuserstatebin30580 -> 32116 bytes
-rw-r--r--iBean/iBean/AddBeanViewController.h34
-rw-r--r--iBean/iBean/AddBeanViewController.m112
-rw-r--r--iBean/iBean/AppDelegate+Storage.h5
-rw-r--r--iBean/iBean/AppDelegate+Storage.m19
-rw-r--r--iBean/iBean/Bean+Interface.h15
-rw-r--r--iBean/iBean/Bean+Interface.m13
-rw-r--r--iBean/iBean/Bean.h2
-rw-r--r--iBean/iBean/Bean.m2
-rw-r--r--iBean/iBean/BeanCollection+Interface.h16
-rw-r--r--iBean/iBean/BeanCollection+Interface.m55
-rw-r--r--iBean/iBean/BeanCollection.h15
-rw-r--r--iBean/iBean/BeanCollection.m2
-rw-r--r--iBean/iBean/BeanCollectionBeanListViewController.h4
-rw-r--r--iBean/iBean/BeanCollectionBeanListViewController.m73
-rw-r--r--iBean/iBean/iBean.xcdatamodeld/iBean.xcdatamodel/contents2
-rw-r--r--iBean/iBean/iPhoneStoryboard.storyboard196
18 files changed, 567 insertions, 56 deletions
diff --git a/iBean/iBean.xcodeproj/project.pbxproj b/iBean/iBean.xcodeproj/project.pbxproj
index d67b623..c17a052 100644
--- a/iBean/iBean.xcodeproj/project.pbxproj
+++ b/iBean/iBean.xcodeproj/project.pbxproj
@@ -23,10 +23,13 @@
020C55C716910EAD00D8224C /* InstaBeanConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C55C616910EAD00D8224C /* InstaBeanConfiguration.m */; };
020C55CA1691100000D8224C /* AppDelegate+Storage.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C55C91691100000D8224C /* AppDelegate+Storage.m */; };
020C55FA16983E9900D8224C /* BeanCollectionListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C55F916983E9900D8224C /* BeanCollectionListViewController.m */; };
- 020C55FD16983F7400D8224C /* Bean.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C55FC16983F7400D8224C /* Bean.m */; };
- 020C560016983F7400D8224C /* BeanCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C55FF16983F7400D8224C /* BeanCollection.m */; };
020C560316989D4500D8224C /* BeanCollectionInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C560216989D4500D8224C /* BeanCollectionInfoViewController.m */; };
020C56061698A85000D8224C /* BeanCollectionBeanListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C56051698A85000D8224C /* BeanCollectionBeanListViewController.m */; };
+ 020C5672169E1B0100D8224C /* AddBeanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C5671169E1B0100D8224C /* AddBeanViewController.m */; };
+ 020C567A169F597300D8224C /* Bean.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C5679169F597300D8224C /* Bean.m */; };
+ 020C567D169F597300D8224C /* BeanCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C567C169F597300D8224C /* BeanCollection.m */; };
+ 020C5680169F5E9A00D8224C /* Bean+Interface.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C567F169F5E9900D8224C /* Bean+Interface.m */; };
+ 020C5683169F5FBB00D8224C /* BeanCollection+Interface.m in Sources */ = {isa = PBXBuildFile; fileRef = 020C5682169F5FBB00D8224C /* BeanCollection+Interface.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -54,14 +57,20 @@
020C55C91691100000D8224C /* AppDelegate+Storage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+Storage.m"; sourceTree = "<group>"; };
020C55F816983E9900D8224C /* BeanCollectionListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BeanCollectionListViewController.h; sourceTree = "<group>"; };
020C55F916983E9900D8224C /* BeanCollectionListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BeanCollectionListViewController.m; sourceTree = "<group>"; };
- 020C55FB16983F7400D8224C /* Bean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bean.h; sourceTree = "<group>"; };
- 020C55FC16983F7400D8224C /* Bean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Bean.m; sourceTree = "<group>"; };
- 020C55FE16983F7400D8224C /* BeanCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BeanCollection.h; sourceTree = "<group>"; };
- 020C55FF16983F7400D8224C /* BeanCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BeanCollection.m; sourceTree = "<group>"; };
020C560116989D4500D8224C /* BeanCollectionInfoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BeanCollectionInfoViewController.h; sourceTree = "<group>"; };
020C560216989D4500D8224C /* BeanCollectionInfoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BeanCollectionInfoViewController.m; sourceTree = "<group>"; };
020C56041698A85000D8224C /* BeanCollectionBeanListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BeanCollectionBeanListViewController.h; sourceTree = "<group>"; };
020C56051698A85000D8224C /* BeanCollectionBeanListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BeanCollectionBeanListViewController.m; sourceTree = "<group>"; };
+ 020C5670169E1B0100D8224C /* AddBeanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddBeanViewController.h; sourceTree = "<group>"; };
+ 020C5671169E1B0100D8224C /* AddBeanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddBeanViewController.m; sourceTree = "<group>"; };
+ 020C5678169F597300D8224C /* Bean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bean.h; sourceTree = "<group>"; };
+ 020C5679169F597300D8224C /* Bean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Bean.m; sourceTree = "<group>"; };
+ 020C567B169F597300D8224C /* BeanCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BeanCollection.h; sourceTree = "<group>"; };
+ 020C567C169F597300D8224C /* BeanCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BeanCollection.m; sourceTree = "<group>"; };
+ 020C567E169F5E9900D8224C /* Bean+Interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Bean+Interface.h"; sourceTree = "<group>"; };
+ 020C567F169F5E9900D8224C /* Bean+Interface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Bean+Interface.m"; sourceTree = "<group>"; };
+ 020C5681169F5FBA00D8224C /* BeanCollection+Interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "BeanCollection+Interface.h"; sourceTree = "<group>"; };
+ 020C5682169F5FBB00D8224C /* BeanCollection+Interface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "BeanCollection+Interface.m"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -162,6 +171,7 @@
020C56081698F58900D8224C /* BeanCollectionList */,
020C56091698F59F00D8224C /* BeanCollectionInfo */,
020C56071698F4DC00D8224C /* BeanCollectionBeanList */,
+ 020C566E169E1ACB00D8224C /* Bean */,
020C55DF169792F800D8224C /* Data */,
);
name = iBean;
@@ -170,10 +180,11 @@
020C55DF169792F800D8224C /* Data */ = {
isa = PBXGroup;
children = (
- 020C55FE16983F7400D8224C /* BeanCollection.h */,
- 020C55FF16983F7400D8224C /* BeanCollection.m */,
- 020C55FB16983F7400D8224C /* Bean.h */,
- 020C55FC16983F7400D8224C /* Bean.m */,
+ 020C5684169F603700D8224C /* Interface */,
+ 020C567B169F597300D8224C /* BeanCollection.h */,
+ 020C567C169F597300D8224C /* BeanCollection.m */,
+ 020C5678169F597300D8224C /* Bean.h */,
+ 020C5679169F597300D8224C /* Bean.m */,
);
name = Data;
sourceTree = "<group>";
@@ -205,6 +216,26 @@
name = BeanCollectionInfo;
sourceTree = "<group>";
};
+ 020C566E169E1ACB00D8224C /* Bean */ = {
+ isa = PBXGroup;
+ children = (
+ 020C5670169E1B0100D8224C /* AddBeanViewController.h */,
+ 020C5671169E1B0100D8224C /* AddBeanViewController.m */,
+ );
+ name = Bean;
+ sourceTree = "<group>";
+ };
+ 020C5684169F603700D8224C /* Interface */ = {
+ isa = PBXGroup;
+ children = (
+ 020C567E169F5E9900D8224C /* Bean+Interface.h */,
+ 020C567F169F5E9900D8224C /* Bean+Interface.m */,
+ 020C5681169F5FBA00D8224C /* BeanCollection+Interface.h */,
+ 020C5682169F5FBB00D8224C /* BeanCollection+Interface.m */,
+ );
+ name = Interface;
+ sourceTree = "<group>";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -278,10 +309,13 @@
020C55C716910EAD00D8224C /* InstaBeanConfiguration.m in Sources */,
020C55CA1691100000D8224C /* AppDelegate+Storage.m in Sources */,
020C55FA16983E9900D8224C /* BeanCollectionListViewController.m in Sources */,
- 020C55FD16983F7400D8224C /* Bean.m in Sources */,
- 020C560016983F7400D8224C /* BeanCollection.m in Sources */,
020C560316989D4500D8224C /* BeanCollectionInfoViewController.m in Sources */,
020C56061698A85000D8224C /* BeanCollectionBeanListViewController.m in Sources */,
+ 020C5672169E1B0100D8224C /* AddBeanViewController.m in Sources */,
+ 020C567A169F597300D8224C /* Bean.m in Sources */,
+ 020C567D169F597300D8224C /* BeanCollection.m in Sources */,
+ 020C5680169F5E9A00D8224C /* Bean+Interface.m in Sources */,
+ 020C5683169F5FBB00D8224C /* BeanCollection+Interface.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/iBean/iBean.xcodeproj/project.xcworkspace/xcuserdata/eddiex.xcuserdatad/UserInterfaceState.xcuserstate b/iBean/iBean.xcodeproj/project.xcworkspace/xcuserdata/eddiex.xcuserdatad/UserInterfaceState.xcuserstate
index b147436..c78c824 100644
--- a/iBean/iBean.xcodeproj/project.xcworkspace/xcuserdata/eddiex.xcuserdatad/UserInterfaceState.xcuserstate
+++ b/iBean/iBean.xcodeproj/project.xcworkspace/xcuserdata/eddiex.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/iBean/iBean/AddBeanViewController.h b/iBean/iBean/AddBeanViewController.h
new file mode 100644
index 0000000..155e18b
--- /dev/null
+++ b/iBean/iBean/AddBeanViewController.h
@@ -0,0 +1,34 @@
+//
+// AddBeanViewController.h
+// iBean
+//
+// Created by Eddie Ehlin on 2013-01-09.
+// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+@class BeanCollection;
+
+@interface AddBeanViewController : UIViewController
+
+@property (nonatomic, strong) BeanCollection *beanCollection;
+@property (nonatomic, assign) BOOL editMode;
+
+/* Utility methods */
+- (void) initViewController;
+- (void) initWithModeAndBeanCollection:(BOOL)editMode: (BeanCollection*) bc;
+
+/* UI Outlets */
+@property (weak, nonatomic) IBOutlet UITextField *beanNameTextField;
+@property (weak, nonatomic) IBOutlet UILabel *amountLabel;
+@property (weak, nonatomic) IBOutlet UIStepper *amountStepper;
+@property (weak, nonatomic) IBOutlet UILabel *grinderSettingLabel;
+@property (weak, nonatomic) IBOutlet UIStepper *grinderSettingStepper;
+
+/* UI Actions */
+- (IBAction) amountStepperChanged:(id)sender;
+- (IBAction) grinderSettingStepperChanged:(id)sender;
+- (IBAction) cancelBean:(id)sender;
+- (IBAction) commitBean:(id)sender;
+
+@end
diff --git a/iBean/iBean/AddBeanViewController.m b/iBean/iBean/AddBeanViewController.m
new file mode 100644
index 0000000..bebea6f
--- /dev/null
+++ b/iBean/iBean/AddBeanViewController.m
@@ -0,0 +1,112 @@
+//
+// AddBeanViewController.m
+// iBean
+//
+// Created by Eddie Ehlin on 2013-01-09.
+// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
+//
+
+#import "AppDelegate+Storage.h"
+#import "AddBeanViewController.h"
+#import "Bean+Interface.h"
+#import "BeanCollection+Interface.h"
+
+@interface AddBeanViewController ()
+
+@end
+
+@implementation AddBeanViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Do any additional setup after loading the view.
+}
+
+- (void) viewWillAppear:(BOOL)animated
+{
+ [super viewWillAppear:animated];
+ [self initViewController];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+/*****************************************************
+ Utility methods
+ *****************************************************/
+- (void) initViewController
+{
+ NSLog(@"AddBeanViewController - initViewController");
+
+ if (self.editMode == YES)
+ {
+ //TODO: Update UI to refelect edit mode.
+
+ //+ set UI controls with values from beanCollection.
+ NSLog(@"AddBeanViewController - in edit state");
+ }
+ else
+ {
+ NSLog(@"AddBeanViewController - in add new state");
+ }
+}
+
+- (void) initWithModeAndBeanCollection:(BOOL)editMode: (BeanCollection*) bc
+{
+ NSLog(@"AddBeanViewController - initWithModeAndBeanCollection");
+ self.editMode = editMode;
+ self.beanCollection = bc;
+}
+
+/*****************************************************
+ UI Actions
+ *****************************************************/
+#pragma mark - IBActions
+- (void) amountStepperChanged:(id)sender
+{
+ self.amountLabel.text = [NSString stringWithFormat:@"%1.1f", self.amountStepper.value];
+}
+
+- (void) grinderSettingStepperChanged:(id)sender
+{
+ self.grinderSettingLabel.text = [NSString stringWithFormat:@"%1.1f", self.grinderSettingStepper.value];
+}
+
+- (void) cancelBean:(id)sender
+{
+ [self dismissViewControllerAnimated:YES completion:nil];
+}
+
+- (void) commitBean:(id)sender
+{
+ Bean *b = [(AppDelegate*) [[UIApplication sharedApplication] delegate] createBean];
+ if (b != nil && self.beanCollection != nil)
+ {
+ b.amount = [NSNumber numberWithDouble:self.amountStepper.value];
+ b.name = self.beanNameTextField.text;
+ b.grindSetting = [NSNumber numberWithDouble:self.grinderSettingStepper.value];
+ [self.beanCollection addBeansObject:b];
+#warning TODO - If we are in edit mode (for the bean collection) should we commit the managed context?
+
+ //Go back to the bean list.
+ [self dismissViewControllerAnimated:YES completion:nil];
+ }
+ else
+ {
+#warning TODO - Messagebox telling user that error occured.
+ }
+}
+@end
diff --git a/iBean/iBean/AppDelegate+Storage.h b/iBean/iBean/AppDelegate+Storage.h
index effcd92..e56b8bf 100644
--- a/iBean/iBean/AppDelegate+Storage.h
+++ b/iBean/iBean/AppDelegate+Storage.h
@@ -9,6 +9,7 @@
#import "AppDelegate.h"
@class InstaBeanConfiguration;
@class BeanCollection;
+@class Bean;
/*
Main purpose of this category is to have all storage (core data) related
@@ -30,8 +31,6 @@
#pragma mark - iBean related storage methods
- (NSArray*) getBeanCollections;
- (BeanCollection*) createBeanCollection;
+- (Bean*) createBean;
-
-
-//warning TODO: Create methods for fetching managedContext (if needed?) as well methods for saving/deleting/fetching core data objects.
@end
diff --git a/iBean/iBean/AppDelegate+Storage.m b/iBean/iBean/AppDelegate+Storage.m
index 9acaeb2..4f8fc0d 100644
--- a/iBean/iBean/AppDelegate+Storage.m
+++ b/iBean/iBean/AppDelegate+Storage.m
@@ -80,7 +80,7 @@
{
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"BeanCollection"];
//For now we sort them on name.
- fetchRequest.sortDescriptors = [NSArray arrayWithObject: [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:NO]];
+ fetchRequest.sortDescriptors = [NSArray arrayWithObject: [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
NSError *fetchRequestError = nil;
fetchRequestResult = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchRequestError];
@@ -113,6 +113,23 @@
return bc;
}
+- (Bean*) createBean
+{
+ Bean *b = nil;
+
+ if (self.managedObjectContext != nil)
+ {
+ b = [NSEntityDescription insertNewObjectForEntityForName:@"Bean" inManagedObjectContext:self.managedObjectContext];
+
+ //Set default values
+ if (b != nil)
+ {
+ //TODO: Set default values here...
+ }
+ }
+ return b;
+}
+
@end
diff --git a/iBean/iBean/Bean+Interface.h b/iBean/iBean/Bean+Interface.h
new file mode 100644
index 0000000..3b4874c
--- /dev/null
+++ b/iBean/iBean/Bean+Interface.h
@@ -0,0 +1,15 @@
+//
+// Bean+Interface.h
+// iBean
+//
+// Created by Eddie Ehlin on 2013-01-10.
+// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
+//
+
+#import "Bean.h"
+
+@interface Bean (Interface)
+
+
+
+@end
diff --git a/iBean/iBean/Bean+Interface.m b/iBean/iBean/Bean+Interface.m
new file mode 100644
index 0000000..baf7430
--- /dev/null
+++ b/iBean/iBean/Bean+Interface.m
@@ -0,0 +1,13 @@
+//
+// Bean+Interface.m
+// iBean
+//
+// Created by Eddie Ehlin on 2013-01-10.
+// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
+//
+
+#import "Bean+Interface.h"
+
+@implementation Bean (Interface)
+
+@end
diff --git a/iBean/iBean/Bean.h b/iBean/iBean/Bean.h
index 80094b3..eb74a10 100644
--- a/iBean/iBean/Bean.h
+++ b/iBean/iBean/Bean.h
@@ -2,7 +2,7 @@
// Bean.h
// iBean
//
-// Created by Eddie Ehlin on 2013-01-05.
+// Created by Eddie Ehlin on 2013-01-10.
// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
//
diff --git a/iBean/iBean/Bean.m b/iBean/iBean/Bean.m
index fbb21b3..6c6a6b4 100644
--- a/iBean/iBean/Bean.m
+++ b/iBean/iBean/Bean.m
@@ -2,7 +2,7 @@
// Bean.m
// iBean
//
-// Created by Eddie Ehlin on 2013-01-05.
+// Created by Eddie Ehlin on 2013-01-10.
// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
//
diff --git a/iBean/iBean/BeanCollection+Interface.h b/iBean/iBean/BeanCollection+Interface.h
new file mode 100644
index 0000000..6df1040
--- /dev/null
+++ b/iBean/iBean/BeanCollection+Interface.h
@@ -0,0 +1,16 @@
+//
+// BeanCollection+Interface.h
+// iBean
+//
+// Created by Eddie Ehlin on 2013-01-10.
+// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
+//
+
+#import "BeanCollection.h"
+
+@interface BeanCollection (Interface)
+
+- (void) addBeansObject: (Bean *)b;
+- (void) removeObjectFromBeansAtIndex:(NSUInteger)beanIndex;
+- (void)replaceBeansAtIndexes:(NSIndexSet *)beanIndexes withBeans:(NSArray *)beans;
+@end
diff --git a/iBean/iBean/BeanCollection+Interface.m b/iBean/iBean/BeanCollection+Interface.m
new file mode 100644
index 0000000..e01e25e
--- /dev/null
+++ b/iBean/iBean/BeanCollection+Interface.m
@@ -0,0 +1,55 @@
+//
+// BeanCollection+Interface.m
+// iBean
+//
+// Created by Eddie Ehlin on 2013-01-10.
+// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
+//
+
+#import "BeanCollection+Interface.h"
+
+@implementation BeanCollection (Interface)
+
+- (void) addBeansObject:(Bean *)b
+{
+ NSMutableOrderedSet *tmpSet = [self mutableOrderedSetValueForKey:@"beans"];
+ [tmpSet addObject:b];
+}
+
+- (void) removeObjectFromBeansAtIndex:(NSUInteger)beanIndex
+{
+ /*
+ NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx];
+ [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"beans"];
+ NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:@"beans"]];
+ [tmpOrderedSet removeObjectAtIndex:idx];
+ [self setPrimitiveValue:tmpOrderedSet forKey:@"beans"];
+ [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"beans"];
+ */
+
+ NSMutableOrderedSet *tmpSet = [self mutableOrderedSetValueForKey:@"beans"];
+ if (beanIndex >= 0 && beanIndex < tmpSet.count)
+ [tmpSet removeObjectAtIndex:beanIndex];
+ else
+ NSLog(@"BeanCollection+Interface - removeBeansObjectAtIndex: Index out of range!");
+}
+
+- (void)replaceBeansAtIndexes:(NSIndexSet *)beanIndexes withBeans:(NSArray *)beans {
+ /*
+ [self willChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:@"beans"];
+ NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:@"beans"]];
+ [tmpOrderedSet replaceObjectsAtIndexes:indexes withObjects:values];
+ [self setPrimitiveValue:tmpOrderedSet forKey:@"beans"];
+ [self didChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:@"beans"];
+ */
+
+ if (beans.count > 0)
+ {
+ NSMutableOrderedSet *tmpSet = [self mutableOrderedSetValueForKey:@"beans"];
+ [tmpSet replaceObjectsAtIndexes:beanIndexes withObjects:beans];
+ }
+
+}
+
+
+@end
diff --git a/iBean/iBean/BeanCollection.h b/iBean/iBean/BeanCollection.h
index 801fa4c..08f03da 100644
--- a/iBean/iBean/BeanCollection.h
+++ b/iBean/iBean/BeanCollection.h
@@ -2,7 +2,7 @@
// BeanCollection.h
// iBean
//
-// Created by Eddie Ehlin on 2013-01-05.
+// Created by Eddie Ehlin on 2013-01-10.
// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
//
@@ -19,14 +19,19 @@
@property (nonatomic, retain) NSDate * modified;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * note;
-@property (nonatomic, retain) NSSet *beans;
+@property (nonatomic, retain) NSOrderedSet *beans;
@end
@interface BeanCollection (CoreDataGeneratedAccessors)
+- (void)insertObject:(Bean *)value inBeansAtIndex:(NSUInteger)idx;
+- (void)removeObjectFromBeansAtIndex:(NSUInteger)idx;
+- (void)insertBeans:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
+- (void)removeBeansAtIndexes:(NSIndexSet *)indexes;
+- (void)replaceObjectInBeansAtIndex:(NSUInteger)idx withObject:(Bean *)value;
+- (void)replaceBeansAtIndexes:(NSIndexSet *)indexes withBeans:(NSArray *)values;
- (void)addBeansObject:(Bean *)value;
- (void)removeBeansObject:(Bean *)value;
-- (void)addBeans:(NSSet *)values;
-- (void)removeBeans:(NSSet *)values;
-
+- (void)addBeans:(NSOrderedSet *)values;
+- (void)removeBeans:(NSOrderedSet *)values;
@end
diff --git a/iBean/iBean/BeanCollection.m b/iBean/iBean/BeanCollection.m
index 39107ba..21ac2ab 100644
--- a/iBean/iBean/BeanCollection.m
+++ b/iBean/iBean/BeanCollection.m
@@ -2,7 +2,7 @@
// BeanCollection.m
// iBean
//
-// Created by Eddie Ehlin on 2013-01-05.
+// Created by Eddie Ehlin on 2013-01-10.
// Copyright (c) 2013 Eddie Ehlin. All rights reserved.
//
diff --git a/iBean/iBean/BeanCollectionBeanListViewController.h b/iBean/iBean/BeanCollectionBeanListViewController.h
index 5865904..ec6e47d 100644
--- a/iBean/iBean/BeanCollectionBeanListViewController.h
+++ b/iBean/iBean/BeanCollectionBeanListViewController.h
@@ -13,6 +13,7 @@
@property (nonatomic, strong) BeanCollection *beanCollection;
@property (nonatomic, assign) BOOL editMode;
+@property (nonatomic, strong) UIBarButtonItem *beanListEditDoneButton;
/* Utility methods */
- (void) initViewController;
@@ -20,8 +21,11 @@
/* UI Outlets */
@property (weak, nonatomic) IBOutlet UITableView *beanListTableView;
+@property (strong, nonatomic) IBOutlet UIBarButtonItem *beanListEditButton;
+@property (weak, nonatomic) IBOutlet UIToolbar *beanListBottomToolbar;
/* UI Actions */
+- (IBAction) toggleEditMode:(id)sender;
@end
diff --git a/iBean/iBean/BeanCollectionBeanListViewController.m b/iBean/iBean/BeanCollectionBeanListViewController.m
index 4564776..08b1eed 100644
--- a/iBean/iBean/BeanCollectionBeanListViewController.m
+++ b/iBean/iBean/BeanCollectionBeanListViewController.m
@@ -7,7 +7,9 @@
//
#import "BeanCollectionBeanListViewController.h"
+#import "AddBeanViewController.h"
#import "BeanCollection.h"
+#import "Bean.h"
@interface BeanCollectionBeanListViewController ()
@@ -45,6 +47,23 @@
// Dispose of any resources that can be recreated.
}
+- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
+{
+ //AddBeanSegue
+ if ([segue.identifier isEqualToString:@"AddBeanSegue"])
+ {
+ //Pass on the edit/add state and bean collection
+ AddBeanViewController *beanViewController = segue.destinationViewController;
+ [beanViewController initWithModeAndBeanCollection:self.editMode :self.beanCollection];
+
+ //TODO: Check what last grinder setting was (last bean) and pre set it
+ }
+ else if ([segue.identifier isEqualToString:@"EditBeanSegue"])
+ {
+ //TODO
+ }
+}
+
/*****************************************************
Utility methods
*****************************************************/
@@ -52,8 +71,11 @@
{
NSLog(@"BeanCollectionBeanListViewController - initViewController");
+ //Allocate edit's "Done" button
+ self.beanListEditDoneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(toggleEditMode:)];
+
//Load beans into the table view.
- //[self.beanListTableView reloadData];
+ [self.beanListTableView reloadData];
if (self.editMode == YES)
{
@@ -80,6 +102,20 @@
UI Actions
*****************************************************/
#pragma mark - IBActions
+- (void) toggleEditMode:(id)sender
+{
+ NSMutableArray *bottomToolbarItems = [NSMutableArray arrayWithArray:self.beanListBottomToolbar.items];
+ if (self.beanListTableView.editing)
+ {
+ [bottomToolbarItems replaceObjectAtIndex:0 withObject:self.beanListEditButton];
+ }
+ else
+ {
+ [bottomToolbarItems replaceObjectAtIndex:0 withObject:self.beanListEditDoneButton];
+ }
+ [self.beanListTableView setEditing:!self.beanListTableView.editing animated:YES];
+ [self.beanListBottomToolbar setItems:bottomToolbarItems animated:YES];
+}
/*****************************************************
UITableView related delegate / datasource methods
@@ -102,9 +138,9 @@
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//Configure the cell and set its title
+ Bean *currentBean = [self.beanCollection.beans objectAtIndex:indexPath.row];
#warning TODO: This may fuck things up since the beanCollection.beans set is NOT ordered?
- BeanCollection *currentCollection = [[self.beanCollection.beans allObjects] objectAtIndex:indexPath.row];
- cell.textLabel.text = currentCollection.name;
+ cell.textLabel.text = currentBean.name;
return cell;
}
@@ -121,7 +157,12 @@
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
-#warning TODO - Implement this (look at CollectionList....)
+ if (self.beanCollection != nil)
+ {
+#warning TODO - Do we need to remove it via delegate, and then reload the structure or just remove it?
+ [self.beanCollection removeObjectFromBeansAtIndex: indexPath.row];
+ }
+#warning TODO - Double check that correct bean is removed!
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
@@ -129,5 +170,29 @@
}
}
+ // Override to support conditional rearranging of the table view.
+ - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
+ {
+ // Return NO if you do not want the item to be re-orderable.
+ return YES;
+ }
+
+ // Override to support rearranging the table view.
+//http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/ManageReorderRow/ManageReorderRow.html
+ - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
+ {
+ if (self.beanCollection != nil && fromIndexPath.row != toIndexPath.row)
+ {
+ NSLog(@"From: %d, To: %d", fromIndexPath.row, toIndexPath.row);
+ if (toIndexPath.row < (self.beanCollection.beans.count - 1))
+ {
+ NSMutableIndexSet *beanIndexes = [NSMutableIndexSet indexSetWithIndex:fromIndexPath.row];
+ [beanIndexes addIndex:toIndexPath.row];
+ NSArray *beans = [NSArray arrayWithObjects:[self.beanCollection.beans objectAtIndex:fromIndexPath.row], [self.beanCollection.beans objectAtIndex:toIndexPath.row], nil];
+ [self.beanCollection replaceBeansAtIndexes:beanIndexes withBeans:beans];
+ }
+ }
+#warning TODO - Make sure to test to "view/edit" bean after moving it, so that it is correct item! :-)
+ }
@end
diff --git a/iBean/iBean/iBean.xcdatamodeld/iBean.xcdatamodel/contents b/iBean/iBean/iBean.xcdatamodeld/iBean.xcdatamodel/contents
index 4677f93..f7f7901 100644
--- a/iBean/iBean/iBean.xcdatamodeld/iBean.xcdatamodel/contents
+++ b/iBean/iBean/iBean.xcdatamodeld/iBean.xcdatamodel/contents
@@ -13,7 +13,7 @@
<attribute name="modified" optional="YES" attributeType="Date" syncable="YES"/>
<attribute name="name" optional="YES" attributeType="String" syncable="YES"/>
<attribute name="note" optional="YES" attributeType="String" syncable="YES"/>
- <relationship name="beans" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Bean" inverseName="beanCollection" inverseEntity="Bean" syncable="YES"/>
+ <relationship name="beans" optional="YES" toMany="YES" deletionRule="Cascade" ordered="YES" destinationEntity="Bean" inverseName="beanCollection" inverseEntity="Bean" syncable="YES"/>
</entity>
<entity name="InstaBeanConfiguration" representedClassName="InstaBeanConfiguration" syncable="YES">
<attribute name="extractionTime" optional="YES" attributeType="Double" defaultValueString="0.0" syncable="YES"/>
diff --git a/iBean/iBean/iPhoneStoryboard.storyboard b/iBean/iBean/iPhoneStoryboard.storyboard
index 5fc65b8..9fbf609 100644
--- a/iBean/iBean/iPhoneStoryboard.storyboard
+++ b/iBean/iBean/iPhoneStoryboard.storyboard
@@ -236,7 +236,7 @@
</constraints>
</view>
<navigationItem key="navigationItem" title="Information (1/3)" id="znt-MK-XJf">
- <barButtonItem key="leftBarButtonItem" title="Cancel" id="x9O-iQ-Nw6">
+ <barButtonItem key="leftBarButtonItem" systemItem="cancel" id="x9O-iQ-Nw6">
<connections>
<segue destination="C1o-is-nML" kind="modal" id="roV-hD-UY6"/>
</connections>
@@ -269,11 +269,11 @@
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="bW3-E7-UoQ">
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
- <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="BeanCell" textLabel="87B-hs-oLz" style="IBUITableViewCellStyleDefault" id="4VM-0O-fxA">
+ <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="BeanCell" textLabel="87B-hs-oLz" style="IBUITableViewCellStyleDefault" id="4VM-0O-fxA">
<rect key="frame" x="0.0" y="22" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
+ <rect key="frame" x="0.0" y="0.0" width="300" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Bean title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="87B-hs-oLz">
@@ -284,6 +284,9 @@
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
+ <connections>
+ <segue destination="4CQ-Gd-pSW" kind="push" identifier="EditBeanSegue" id="Fx1-fy-gzR"/>
+ </connections>
</tableViewCell>
</prototypes>
<connections>
@@ -293,11 +296,15 @@
</tableView>
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6cY-dj-XP0">
<items>
- <barButtonItem title="Edit" id="tKF-jM-0Uj"/>
+ <barButtonItem title="Edit" id="tKF-jM-0Uj">
+ <connections>
+ <action selector="toggleEditMode:" destination="utP-dF-IAb" id="AjM-pe-V7f"/>
+ </connections>
+ </barButtonItem>
<barButtonItem style="plain" systemItem="flexibleSpace" id="jlc-7u-JYn"/>
<barButtonItem systemItem="add" id="Uv7-P6-bFk">
<connections>
- <segue destination="YXO-0S-PzZ" kind="push" identifier="AddBeanSegue" id="h8P-86-6Pm"/>
+ <segue destination="YXO-0S-PzZ" kind="modal" identifier="AddBeanSegue" id="h8P-86-6Pm"/>
</connections>
</barButtonItem>
</items>
@@ -322,12 +329,91 @@
</barButtonItem>
</navigationItem>
<connections>
+ <outlet property="beanListBottomToolbar" destination="6cY-dj-XP0" id="Ccm-25-INv"/>
+ <outlet property="beanListEditButton" destination="tKF-jM-0Uj" id="pAL-HD-4GE"/>
<outlet property="beanListTableView" destination="bW3-E7-UoQ" id="ZGo-IU-3Im"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="BhV-Dk-tNN" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
- <point key="canvasLocation" x="2730" y="403"/>
+ <point key="canvasLocation" x="2777" y="403"/>
+ </scene>
+ <!--View Controller - Edit bean-->
+ <scene sceneID="Uz1-1o-7sM">
+ <objects>
+ <viewController id="4CQ-Gd-pSW" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="3Yp-lm-I9K">
+ <rect key="frame" x="0.0" y="64" width="320" height="504"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Name:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tbo-8t-W22">
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter descriptive name for the bean" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="GEQ-Pg-YlJ">
+ <constraints>
+ <constraint firstAttribute="width" constant="281" id="Y2Z-eE-IrG"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits"/>
+ </textField>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Amount (g):" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qb5-I0-339">
+ <constraints>
+ <constraint firstAttribute="width" constant="96" id="LD9-FM-Nhn"/>
+ </constraints>
+ <fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="500" stepValue="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="blJ-S2-uV9"/>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Grinder setting:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bUi-2X-Nne">
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="1000" translatesAutoresizingMaskIntoConstraints="NO" id="bIT-x3-0cE"/>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="###" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o6F-sa-dYn">
+ <constraints>
+ <constraint firstAttribute="width" constant="42" id="d7l-M7-k5y"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="###" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nPM-k1-zYG">
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="o6F-sa-dYn" firstAttribute="leading" secondItem="3Yp-lm-I9K" secondAttribute="leading" constant="144" id="0v6-kO-Mri"/>
+ <constraint firstItem="blJ-S2-uV9" firstAttribute="top" secondItem="3Yp-lm-I9K" secondAttribute="top" constant="119" id="37C-JE-2LQ"/>
+ <constraint firstItem="bUi-2X-Nne" firstAttribute="leading" secondItem="Tbo-8t-W22" secondAttribute="leading" type="default" id="BTS-CE-WSI"/>
+ <constraint firstAttribute="trailing" secondItem="blJ-S2-uV9" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="Kql-Pp-MaV"/>
+ <constraint firstItem="GEQ-Pg-YlJ" firstAttribute="top" secondItem="Tbo-8t-W22" secondAttribute="bottom" constant="8" symbolic="YES" type="default" id="L52-kL-FXZ"/>
+ <constraint firstAttribute="trailing" secondItem="bIT-x3-0cE" secondAttribute="trailing" constant="25" id="MFr-eH-Gd5"/>
+ <constraint firstItem="qb5-I0-339" firstAttribute="leading" secondItem="3Yp-lm-I9K" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="VXd-tb-OoD"/>
+ <constraint firstItem="bUi-2X-Nne" firstAttribute="leading" secondItem="3Yp-lm-I9K" secondAttribute="leading" constant="14" id="WFp-1i-ucU"/>
+ <constraint firstItem="nPM-k1-zYG" firstAttribute="centerY" secondItem="bIT-x3-0cE" secondAttribute="centerY" type="default" id="b9z-GH-iLZ"/>
+ <constraint firstItem="Tbo-8t-W22" firstAttribute="top" secondItem="3Yp-lm-I9K" secondAttribute="top" constant="20" symbolic="YES" type="default" id="dbh-vK-IP0"/>
+ <constraint firstItem="nPM-k1-zYG" firstAttribute="baseline" secondItem="bUi-2X-Nne" secondAttribute="baseline" type="default" id="fc6-DV-eht"/>
+ <constraint firstItem="o6F-sa-dYn" firstAttribute="baseline" secondItem="qb5-I0-339" secondAttribute="baseline" type="default" id="gTY-0N-LM6"/>
+ <constraint firstItem="nPM-k1-zYG" firstAttribute="leading" secondItem="3Yp-lm-I9K" secondAttribute="leading" constant="145" id="mwi-L1-YFq"/>
+ <constraint firstItem="o6F-sa-dYn" firstAttribute="centerY" secondItem="blJ-S2-uV9" secondAttribute="centerY" type="default" id="sQk-uG-tQj"/>
+ <constraint firstItem="GEQ-Pg-YlJ" firstAttribute="leading" secondItem="3Yp-lm-I9K" secondAttribute="leading" constant="13" id="tPV-Xw-rMr"/>
+ <constraint firstItem="bIT-x3-0cE" firstAttribute="top" secondItem="3Yp-lm-I9K" secondAttribute="top" constant="216" id="wFC-kX-wJz"/>
+ </constraints>
+ </view>
+ <navigationItem key="navigationItem" title="Edit bean" id="A3D-NS-DOt">
+ <barButtonItem key="rightBarButtonItem" systemItem="done" id="Dcw-BA-AX2"/>
+ </navigationItem>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="WEn-wW-jac" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="3314" y="744"/>
</scene>
<!--View Controller - Extraction (3/3)-->
<scene sceneID="HiW-Hk-DPa">
@@ -373,14 +459,14 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="xVN-NA-gLQ" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
- <point key="canvasLocation" x="3298" y="403"/>
+ <point key="canvasLocation" x="4498" y="403"/>
</scene>
- <!--View Controller - Bean-->
+ <!--Add Bean View Controller-->
<scene sceneID="w0g-Bq-kR5">
<objects>
- <viewController id="YXO-0S-PzZ" sceneMemberID="viewController">
+ <viewController id="YXO-0S-PzZ" customClass="AddBeanViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="ghC-6L-tQj">
- <rect key="frame" x="0.0" y="64" width="320" height="504"/>
+ <rect key="frame" x="0.0" y="20" width="320" height="548"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Name:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Ya-ar-5en">
@@ -389,6 +475,9 @@
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter descriptive name for the bean" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Agc-Md-Eqn">
+ <constraints>
+ <constraint firstAttribute="width" constant="281" id="WQ1-oe-YTn"/>
+ </constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
@@ -400,8 +489,12 @@
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
- <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="pNd-jx-t84"/>
- <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="###" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Kyc-kO-LC1">
+ <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="500" stepValue="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="pNd-jx-t84">
+ <connections>
+ <action selector="amountStepperChanged:" destination="YXO-0S-PzZ" eventType="valueChanged" id="vOW-sZ-Ybg"/>
+ </connections>
+ </stepper>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0.0" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Kyc-kO-LC1">
<constraints>
<constraint firstAttribute="width" constant="42" id="B4f-Sc-iuA"/>
</constraints>
@@ -414,41 +507,73 @@
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
- <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="jC3-9l-BMe"/>
- <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="###" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hHL-o2-clY">
+ <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="1000" translatesAutoresizingMaskIntoConstraints="NO" id="jC3-9l-BMe">
+ <connections>
+ <action selector="grinderSettingStepperChanged:" destination="YXO-0S-PzZ" eventType="valueChanged" id="f0Q-WO-wvI"/>
+ </connections>
+ </stepper>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0.0" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hHL-o2-clY">
+ <constraints>
+ <constraint firstAttribute="width" constant="29" id="7IX-JY-Sim"/>
+ </constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
+ <navigationBar contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="dAe-1J-Z5P">
+ <constraints>
+ <constraint firstAttribute="width" constant="320" id="nsS-2k-wy5"/>
+ </constraints>
+ <items>
+ <navigationItem title="Bean" id="xZU-h1-dhg">
+ <barButtonItem key="leftBarButtonItem" systemItem="cancel" id="1v4-Op-ecW">
+ <connections>
+ <action selector="cancelBean:" destination="YXO-0S-PzZ" id="H6V-8C-zaU"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem key="rightBarButtonItem" systemItem="done" id="qZu-Oo-8Af">
+ <connections>
+ <action selector="commitBean:" destination="YXO-0S-PzZ" id="qPq-wH-NHg"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
+ </items>
+ </navigationBar>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="hHL-o2-clY" firstAttribute="centerY" secondItem="jC3-9l-BMe" secondAttribute="centerY" type="default" id="1sM-7a-reS"/>
+ <constraint firstItem="Agc-Md-Eqn" firstAttribute="centerX" secondItem="hHL-o2-clY" secondAttribute="centerX" type="default" id="2Lt-hI-wPV"/>
+ <constraint firstItem="Kyc-kO-LC1" firstAttribute="centerX" secondItem="ghC-6L-tQj" secondAttribute="centerX" type="default" id="2uH-Fc-EHc"/>
<constraint firstItem="hHL-o2-clY" firstAttribute="baseline" secondItem="xEq-oC-MEA" secondAttribute="baseline" type="default" id="43h-a4-Meu"/>
- <constraint firstItem="9Ya-ar-5en" firstAttribute="top" secondItem="ghC-6L-tQj" secondAttribute="top" constant="20" symbolic="YES" type="default" id="5FW-23-E1L"/>
<constraint firstItem="Agc-Md-Eqn" firstAttribute="top" secondItem="9Ya-ar-5en" secondAttribute="bottom" constant="8" symbolic="YES" type="default" id="5h5-LQ-Qba"/>
- <constraint firstAttribute="trailing" secondItem="jC3-9l-BMe" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="5xb-gL-fz8"/>
- <constraint firstAttribute="trailing" secondItem="Agc-Md-Eqn" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="6Yu-WN-8Wg"/>
- <constraint firstItem="xEq-oC-MEA" firstAttribute="leading" secondItem="ghC-6L-tQj" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="M1u-yJ-5p4"/>
- <constraint firstItem="Agc-Md-Eqn" firstAttribute="leading" secondItem="ghC-6L-tQj" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="Tsk-6D-L9R"/>
- <constraint firstItem="hHL-o2-clY" firstAttribute="leading" secondItem="xEq-oC-MEA" secondAttribute="trailing" constant="8" symbolic="YES" type="default" id="Vs4-pL-o1v"/>
- <constraint firstItem="9Ya-ar-5en" firstAttribute="leading" secondItem="ghC-6L-tQj" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="bCm-4d-Wta"/>
+ <constraint firstItem="9Ya-ar-5en" firstAttribute="top" secondItem="ghC-6L-tQj" secondAttribute="top" constant="56" id="LTC-5k-f7U"/>
+ <constraint firstAttribute="trailing" secondItem="Agc-Md-Eqn" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="O1O-Eb-6id"/>
+ <constraint firstItem="Agc-Md-Eqn" firstAttribute="leading" secondItem="9Ya-ar-5en" secondAttribute="leading" type="default" id="Vzr-9t-8rK"/>
+ <constraint firstAttribute="trailing" secondItem="jC3-9l-BMe" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="Wbf-lD-OSk"/>
+ <constraint firstItem="xEq-oC-MEA" firstAttribute="leading" secondItem="Agc-Md-Eqn" secondAttribute="leading" type="default" id="aFF-rC-Dgh"/>
<constraint firstItem="Kyc-kO-LC1" firstAttribute="baseline" secondItem="K5g-ln-AQ0" secondAttribute="baseline" type="default" id="bZr-bn-25o"/>
+ <constraint firstItem="dAe-1J-Z5P" firstAttribute="top" secondItem="ghC-6L-tQj" secondAttribute="top" type="default" id="bbT-z9-Mlf"/>
<constraint firstItem="K5g-ln-AQ0" firstAttribute="leading" secondItem="ghC-6L-tQj" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="blM-BY-AMC"/>
- <constraint firstItem="Kyc-kO-LC1" firstAttribute="centerX" secondItem="Agc-Md-Eqn" secondAttribute="centerX" type="default" id="k17-W5-gMi"/>
+ <constraint firstItem="dAe-1J-Z5P" firstAttribute="centerX" secondItem="Agc-Md-Eqn" secondAttribute="centerX" type="default" id="dY6-6N-zm6"/>
<constraint firstAttribute="trailing" secondItem="pNd-jx-t84" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="mTh-qS-7lC"/>
<constraint firstItem="Kyc-kO-LC1" firstAttribute="centerY" secondItem="pNd-jx-t84" secondAttribute="centerY" type="default" id="q7g-KI-mpp"/>
<constraint firstAttribute="bottom" secondItem="jC3-9l-BMe" secondAttribute="bottom" constant="185" id="wga-Xo-SQg"/>
<constraint firstItem="pNd-jx-t84" firstAttribute="top" secondItem="ghC-6L-tQj" secondAttribute="top" constant="138" id="zhn-ni-dd4"/>
</constraints>
</view>
- <navigationItem key="navigationItem" title="Bean" id="D7u-lI-2Vv">
- <barButtonItem key="rightBarButtonItem" systemItem="done" id="qZu-Oo-8Af"/>
- </navigationItem>
+ <navigationItem key="navigationItem" id="oBX-Cx-tP7"/>
+ <connections>
+ <outlet property="amountLabel" destination="Kyc-kO-LC1" id="WFz-Jx-q0Z"/>
+ <outlet property="amountStepper" destination="pNd-jx-t84" id="Gc7-pS-pd3"/>
+ <outlet property="beanNameTextField" destination="Agc-Md-Eqn" id="sAv-gC-aCk"/>
+ <outlet property="grinderSettingLabel" destination="hHL-o2-clY" id="x7w-p1-WzF"/>
+ <outlet property="grinderSettingStepper" destination="jC3-9l-BMe" id="GIc-Fa-E4E"/>
+ </connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="myk-um-Owg" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
- <point key="canvasLocation" x="2730" y="-291"/>
+ <point key="canvasLocation" x="3314" y="31"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="kQ1-YP-ELW">
@@ -471,9 +596,26 @@
</scene>
</scenes>
<classes>
+ <class className="AddBeanViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/AddBeanViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="amountStepperChanged:"/>
+ <relationship kind="action" name="cancelBean:"/>
+ <relationship kind="action" name="commitBean:"/>
+ <relationship kind="action" name="grinderSettingStepperChanged:"/>
+ <relationship kind="outlet" name="amountLabel" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="amountStepper" candidateClass="UIStepper"/>
+ <relationship kind="outlet" name="beanNameTextField" candidateClass="UITextField"/>
+ <relationship kind="outlet" name="grinderSettingLabel" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="grinderSettingStepper" candidateClass="UIStepper"/>
+ </relationships>
+ </class>
<class className="BeanCollectionBeanListViewController" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/BeanCollectionBeanListViewController.h"/>
<relationships>
+ <relationship kind="action" name="toggleEditMode:"/>
+ <relationship kind="outlet" name="beanListBottomToolbar" candidateClass="UIToolbar"/>
+ <relationship kind="outlet" name="beanListEditButton" candidateClass="UIBarButtonItem"/>
<relationship kind="outlet" name="beanListTableView" candidateClass="UITableView"/>
</relationships>
</class>
@@ -518,6 +660,6 @@
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
- <segue reference="roV-hD-UY6"/>
+ <segue reference="CyX-df-8ge"/>
</inferredMetricsTieBreakers>
</document> \ No newline at end of file