diff options
| author | Eddie Ehlin <eddiex@eddiex.se> | 2013-01-30 22:26:41 +0100 | 
|---|---|---|
| committer | Eddie Ehlin <eddiex@eddiex.se> | 2013-01-30 22:26:41 +0100 | 
| commit | 30d48ecfeac942473a4b08de2ac37816793984b0 (patch) | |
| tree | cf8b34bcfe6ec22b3072a5b7af675da046084493 /iBean/iBean | |
| parent | 3b5693d56548f402da841d0dd4bfb4fdba53805d (diff) | |
| download | iBean-30d48ecfeac942473a4b08de2ac37816793984b0.tar.gz iBean-30d48ecfeac942473a4b08de2ac37816793984b0.zip | |
Implemented support for adding and removing thresholds.
Diffstat (limited to 'iBean/iBean')
| -rw-r--r-- | iBean/iBean/AppDelegate+Storage.h | 2 | ||||
| -rw-r--r-- | iBean/iBean/AppDelegate+Storage.m | 17 | ||||
| -rw-r--r-- | iBean/iBean/BeanCollection+Interface.m | 3 | ||||
| -rw-r--r-- | iBean/iBean/Configuration+Interface.h | 4 | ||||
| -rw-r--r-- | iBean/iBean/Configuration+Interface.m | 42 | ||||
| -rw-r--r-- | iBean/iBean/SettingsViewController.m | 10 | ||||
| -rw-r--r-- | iBean/iBean/ThresholdCell.m | 14 | ||||
| -rw-r--r-- | iBean/iBean/ThresholdListViewController.h | 9 | ||||
| -rw-r--r-- | iBean/iBean/ThresholdListViewController.m | 174 | ||||
| -rw-r--r-- | iBean/iBean/ThresholdViewController.h | 17 | ||||
| -rw-r--r-- | iBean/iBean/ThresholdViewController.m | 83 | ||||
| -rw-r--r-- | iBean/iBean/iPhoneStoryboard.storyboard | 61 | 
12 files changed, 370 insertions, 66 deletions
| diff --git a/iBean/iBean/AppDelegate+Storage.h b/iBean/iBean/AppDelegate+Storage.h index 44c4a0f..f668396 100644 --- a/iBean/iBean/AppDelegate+Storage.h +++ b/iBean/iBean/AppDelegate+Storage.h @@ -10,6 +10,7 @@  @class Configuration;  @class BeanCollection;  @class Bean; +@class Threshold;  /*   Main purpose of this category is to have all storage (core data) related @@ -35,6 +36,7 @@  //Thresholds methods  - (void) processThresholds; +- (Threshold*) createThreshold; diff --git a/iBean/iBean/AppDelegate+Storage.m b/iBean/iBean/AppDelegate+Storage.m index fc911f6..fe62969 100644 --- a/iBean/iBean/AppDelegate+Storage.m +++ b/iBean/iBean/AppDelegate+Storage.m @@ -160,6 +160,23 @@    //Find out how to make the list of thresholds sorted on the value.  } +- (Threshold*) createThreshold +{ +  Threshold *t = nil; +   +  if (self.managedObjectContext != nil) +  { +    t = [NSEntityDescription insertNewObjectForEntityForName:@"Threshold" inManagedObjectContext:self.managedObjectContext]; +     +    //Set default values +    if (t != nil) +    { +      //TODO: Set default values here... +    } +  } +  return t; +} +  #pragma mark - Instant extraction related methods (using Configuraiton)  - (NSError*)setInstantExtractionTimer:(NSNumber *)extractionTimer  { diff --git a/iBean/iBean/BeanCollection+Interface.m b/iBean/iBean/BeanCollection+Interface.m index e01e25e..efc35c6 100644 --- a/iBean/iBean/BeanCollection+Interface.m +++ b/iBean/iBean/BeanCollection+Interface.m @@ -34,7 +34,8 @@      NSLog(@"BeanCollection+Interface - removeBeansObjectAtIndex: Index out of range!");  } -- (void)replaceBeansAtIndexes:(NSIndexSet *)beanIndexes withBeans:(NSArray *)beans { +- (void)replaceBeansAtIndexes:(NSIndexSet *)beanIndexes withBeans:(NSArray *)beans +{    /*    [self willChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:@"beans"];    NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:@"beans"]]; diff --git a/iBean/iBean/Configuration+Interface.h b/iBean/iBean/Configuration+Interface.h index d2660b7..6e66cfe 100644 --- a/iBean/iBean/Configuration+Interface.h +++ b/iBean/iBean/Configuration+Interface.h @@ -10,4 +10,8 @@  @interface Configuration (Interface) +- (void) addThresholdsObject: (Threshold *)t; +- (void) removeObjectFromThresholdsAtIndex:(NSUInteger)thresholdIndex; +- (void)replaceThresholdsAtIndexes:(NSIndexSet *)thresholdIndexes withThresholds:(NSArray *)thresholds; +  @end diff --git a/iBean/iBean/Configuration+Interface.m b/iBean/iBean/Configuration+Interface.m index 549997e..230f529 100644 --- a/iBean/iBean/Configuration+Interface.m +++ b/iBean/iBean/Configuration+Interface.m @@ -10,4 +10,46 @@  @implementation Configuration (Interface) +- (void) addThresholdsObject:(Threshold *)t +{ +  NSMutableOrderedSet *tmpSet = [self mutableOrderedSetValueForKey:@"thresholds"]; +  [tmpSet addObject:t]; +} + +- (void) removeObjectFromThresholdsAtIndex:(NSUInteger)thresholdIndex +{ +  /* +   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:@"thresholds"]; +  if (thresholdIndex >= 0 && thresholdIndex < tmpSet.count) +    [tmpSet removeObjectAtIndex:thresholdIndex]; +  else +    NSLog(@"Configuration+Interface - removeObjectFromThresholdsAtIndex: Index out of range!"); +} + +- (void)replaceThresholdsAtIndexes:(NSIndexSet *)thresholdsIndexes withBeans:(NSArray *)thresholds +{ +  /* +   [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 (thresholds.count > 0) +  { +    NSMutableOrderedSet *tmpSet = [self mutableOrderedSetValueForKey:@"thresholds"]; +    [tmpSet replaceObjectsAtIndexes:thresholdsIndexes withObjects:thresholds]; +  } +   +} +  @end diff --git a/iBean/iBean/SettingsViewController.m b/iBean/iBean/SettingsViewController.m index cce498f..242bee1 100644 --- a/iBean/iBean/SettingsViewController.m +++ b/iBean/iBean/SettingsViewController.m @@ -9,6 +9,7 @@  #import "SettingsViewController.h"  #import "Configuration+Interface.h"  #import "AppDelegate+Storage.h" +#import "ThresholdListViewController.h"  @interface SettingsViewController () @@ -48,6 +49,15 @@      // Dispose of any resources that can be recreated.  } +- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +{ +  if ([segue.identifier isEqualToString:@"SettingsThresholdSegue"]) +  { +    ThresholdListViewController *thresholdListViewController = segue.destinationViewController; +    [thresholdListViewController initWithConfiguration:self.configuration]; +  } +} +  /*****************************************************   Utility methods   *****************************************************/ diff --git a/iBean/iBean/ThresholdCell.m b/iBean/iBean/ThresholdCell.m index b18bd57..bc89b4b 100644 --- a/iBean/iBean/ThresholdCell.m +++ b/iBean/iBean/ThresholdCell.m @@ -8,6 +8,7 @@  #import "ThresholdCell.h"  #import "Threshold.h" +#import "AppDelegate+Storage.h"  @implementation ThresholdCell @@ -53,7 +54,18 @@    if (self.threshold != nil)    {      self.threshold.enabled = [NSNumber numberWithBool:self.enabledSwitch.on]; -#warning TODO - Trigger save!? +    NSError* error = [(AppDelegate*) [[UIApplication sharedApplication] delegate] save]; +    if (error != nil) +    { +      //Rollback +      [(AppDelegate*) [[UIApplication sharedApplication] delegate] rollback]; +       +      UIAlertView *switchChangedSaveAlert = [[UIAlertView alloc] initWithTitle:@"Save error!" message:@"iBean was unable to save threshold state!\nPlease try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; +      [switchChangedSaveAlert show]; + +      #warning TODO - Make sure that rollback resets the value back to previous one!!!!! +      self.enabledSwitch.on = [self.threshold.enabled boolValue]; +    }    }  } diff --git a/iBean/iBean/ThresholdListViewController.h b/iBean/iBean/ThresholdListViewController.h index eb909d7..1ec6266 100644 --- a/iBean/iBean/ThresholdListViewController.h +++ b/iBean/iBean/ThresholdListViewController.h @@ -7,14 +7,23 @@  //  #import <UIKit/UIKit.h> +@class Configuration;  @interface ThresholdListViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> +@property (nonatomic, strong) Configuration* configuration; +@property (nonatomic, strong) UIBarButtonItem *thresholdListEditDoneButton; +  /* Utility methods */  - (void) initViewController; +- (void) initWithConfiguration: (Configuration*) configuration;  /* UI Outlets */ +@property (weak, nonatomic) IBOutlet UITableView *thresholdListTableView; +@property (weak, nonatomic) IBOutlet UIToolbar *thresholdListBottomToolbar; +@property (strong, nonatomic) IBOutlet UIBarButtonItem *thresholdListEditButton;  /* UI Actions */ +- (IBAction)toggleEditMode:(id)sender;  @end diff --git a/iBean/iBean/ThresholdListViewController.m b/iBean/iBean/ThresholdListViewController.m index d6ce20e..57db263 100644 --- a/iBean/iBean/ThresholdListViewController.m +++ b/iBean/iBean/ThresholdListViewController.m @@ -7,6 +7,10 @@  //  #import "ThresholdListViewController.h" +#import "ThresholdViewController.h" +#import "Configuration+Interface.h" +#import "ThresholdCell.h" +#import "AppDelegate+Storage.h"  @interface ThresholdListViewController () @@ -29,21 +33,65 @@  	// 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.  } +- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +{ +  if ([segue.identifier isEqualToString:@"ThresholdsAddNewThresholdSegue"]) +  { +    ThresholdViewController* thresholdViewController = segue.destinationViewController; +    [thresholdViewController initWithConfigurationAndThresholdIndex:self.configuration : -1]; +  } +  else if ([segue.identifier isEqualToString:@"ThresholdsEditThresholdSegue"]) +  { +    ThresholdViewController* thresholdViewController = segue.destinationViewController; +    [thresholdViewController initWithConfigurationAndThresholdIndex:self.configuration :self.thresholdListTableView.indexPathForSelectedRow.row]; +  } +} +  /*****************************************************   Utility methods   *****************************************************/ +- (void) initViewController +{ +  NSLog(@"ThresholdListViewController - initViewController"); +  [self.thresholdListTableView reloadData]; +  self.thresholdListEditDoneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(toggleEditMode:)]; +} +- (void) initWithConfiguration:(Configuration *)configuration +{ +  self.configuration = configuration; +}  /*****************************************************   UI Actions   *****************************************************/ - +#pragma mark - IBActions +- (void) toggleEditMode:(id)sender +{ +  NSMutableArray *bottomToolbarItems = [NSMutableArray arrayWithArray:self.thresholdListBottomToolbar.items]; +  if (self.thresholdListTableView.editing) +  { +    [bottomToolbarItems replaceObjectAtIndex:0 withObject:self.thresholdListEditButton]; +  } +  else +  { +    [bottomToolbarItems replaceObjectAtIndex:0 withObject:self.thresholdListEditDoneButton]; +  } +  [self.thresholdListTableView setEditing:!self.thresholdListTableView.editing animated:YES]; +  [self.thresholdListBottomToolbar setItems:bottomToolbarItems animated:YES]; +}  /*****************************************************   Delegates @@ -52,78 +100,98 @@  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  { -#warning Potentially incomplete method implementation.    // Return the number of sections. -  return 0; +  return 1;  }  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  { -#warning Incomplete method implementation.    // Return the number of rows in the section. -  return 0; +  return self.configuration.thresholds.count;  }  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  {    static NSString *CellIdentifier = @"ThresholdCell"; -  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; +  ThresholdCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];    // Configure the cell... +  [cell initWithThresholdEntity:[self.configuration.thresholds objectAtIndex:indexPath.row]];    return cell;  } -/* - // Override to support conditional editing of the table view. - - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath - { - // Return NO if you do not want the specified item to be editable. - return YES; - } - */ - -/* - // Override to support editing the table view. - - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath - { - if (editingStyle == UITableViewCellEditingStyleDelete) { - // Delete the row from the data source - [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; - } - else if (editingStyle == UITableViewCellEditingStyleInsert) { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } - } - */ - -/* - // Override to support rearranging the table view. - - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath - { - } - */ - -/* - // 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; - } - */ -  #pragma mark - Table view delegate -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +// Override to support conditional editing of the table view. +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath  { -  // Navigation logic may go here. Create and push another view controller. -  /* -   <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; -   // ... -   // Pass the selected object to the new view controller. -   [self.navigationController pushViewController:detailViewController animated:YES]; -   */ +  // Return NO if you do not want the specified item to be editable (we want to be able to REMOVE though). +  return YES;  } +// Override to support editing the table view. +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +{ +  if (editingStyle == UITableViewCellEditingStyleDelete) { +    // Delete the row from the data source +    if (self.configuration != nil) +    { +      [self.configuration removeObjectFromThresholdsAtIndex: indexPath.row]; +    } +    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; +     +    //Commit change! +    if ([(AppDelegate*) [[UIApplication sharedApplication] delegate] save] != nil) +    { +      UIAlertView *deleteRowAlert = [[UIAlertView alloc] initWithTitle:@"Configuration error!" message:@"iBean was unable to delete threshold!\nPlease try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; +      [deleteRowAlert show]; +       +      //Rollback and reload table view +      [(AppDelegate*) [[UIApplication sharedApplication] delegate] rollback]; +      [self.thresholdListTableView reloadData]; +    } +     +  } +  else if (editingStyle == UITableViewCellEditingStyleInsert) { +    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view +  } +} + +// 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.configuration != nil && fromIndexPath.row != toIndexPath.row) +  { +    NSLog(@"From: %d, To: %d", fromIndexPath.row, toIndexPath.row); +    if (toIndexPath.row < (self.configuration.thresholds.count - 1)) +    { +      NSMutableIndexSet *thresholdIndexes = [NSMutableIndexSet indexSetWithIndex:fromIndexPath.row]; +      [thresholdIndexes addIndex:toIndexPath.row]; +      NSArray *thresholds = [NSArray arrayWithObjects:[self.configuration.thresholds objectAtIndex:fromIndexPath.row], [self.configuration.thresholds objectAtIndex:toIndexPath.row], nil]; +      [self.configuration replaceThresholdsAtIndexes:thresholdIndexes withThresholds:thresholds]; +       +      //Commit change +      if ([(AppDelegate*) [[UIApplication sharedApplication] delegate] save] != nil) +      { +        UIAlertView *deleteRowAlert = [[UIAlertView alloc] initWithTitle:@"Configuration error!" message:@"iBean was unable to move threshold!\nPlease try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; +        [deleteRowAlert show]; +         +        //Rollback and reload table view +        [(AppDelegate*) [[UIApplication sharedApplication] delegate] rollback]; +        [self.thresholdListTableView reloadData]; +      } +    } +  } +} + +  @end diff --git a/iBean/iBean/ThresholdViewController.h b/iBean/iBean/ThresholdViewController.h index dc63752..29d4874 100644 --- a/iBean/iBean/ThresholdViewController.h +++ b/iBean/iBean/ThresholdViewController.h @@ -7,14 +7,29 @@  //  #import <UIKit/UIKit.h> +@class Threshold; +@class Configuration; -@interface ThresholdViewController : UITableViewController +@interface ThresholdViewController : UITableViewController <UITextFieldDelegate> + +@property (nonatomic, assign) NSInteger thresholdObjectIndex; +@property (nonatomic, strong) Configuration* configuration;  /* Utility methods */  - (void) initViewController; +- (void) initWithConfigurationAndThresholdIndex: (Configuration*) configuration: (NSInteger) thresholdIndex;  /* UI Outlets */ +@property (weak, nonatomic) IBOutlet UITextField *thresholdNameTextField; +@property (weak, nonatomic) IBOutlet UILabel *thresholdValueLabel; +@property (weak, nonatomic) IBOutlet UIStepper *thresholdValueStepper; +@property (weak, nonatomic) IBOutlet UISwitch *thresholdEnabledSwitch;  /* UI Actions */ +- (IBAction)valueStepperChanged:(id)sender; +- (IBAction)commitThreshold:(id)sender; + +/* UITextFieldDelegate */ +- (BOOL)textFieldShouldReturn:(UITextField *)textField;  @end diff --git a/iBean/iBean/ThresholdViewController.m b/iBean/iBean/ThresholdViewController.m index 1769dfe..2e01373 100644 --- a/iBean/iBean/ThresholdViewController.m +++ b/iBean/iBean/ThresholdViewController.m @@ -6,7 +6,10 @@  //  Copyright (c) 2013 Eddie Ehlin. All rights reserved.  // +#import "AppDelegate+Storage.h"  #import "ThresholdViewController.h" +#import "Threshold.h" +#import "Configuration+Interface.h"  @interface ThresholdViewController () @@ -34,6 +37,12 @@      // self.navigationItem.rightBarButtonItem = self.editButtonItem;  } +- (void) viewWillAppear:(BOOL)animated +{ +  [super viewWillAppear:animated]; +  [self initViewController]; +} +  - (void)didReceiveMemoryWarning  {      [super didReceiveMemoryWarning]; @@ -43,15 +52,89 @@  /*****************************************************   Utility methods   *****************************************************/ +- (void) initViewController +{ +  NSLog(@"ThresholdViewController - initViewController"); +   +  if (self.thresholdObjectIndex >= 0 && self.thresholdObjectIndex <= self.configuration.thresholds.count) +  { +    //We are editing an existing threshold! +    Threshold *tmpThreshold = [self.configuration.thresholds objectAtIndex:self.thresholdObjectIndex]; +    self.thresholdNameTextField.text = tmpThreshold.name; +    self.thresholdEnabledSwitch.on = [tmpThreshold.enabled boolValue]; +    self.thresholdValueStepper.value = [tmpThreshold.value doubleValue]; +    [self valueStepperChanged:self]; +  } +   +} +- (void) initWithConfigurationAndThresholdIndex: (Configuration*) configuration: (NSInteger) thresholdIndex; +{ +  self.configuration = configuration; +  self.thresholdObjectIndex = thresholdIndex; +}  /*****************************************************   UI Actions   *****************************************************/ +- (void) valueStepperChanged:(id)sender +{ +  self.thresholdValueLabel.text = [[NSNumber numberWithDouble:self.thresholdValueStepper.value] stringValue]; +} + +- (void) commitThreshold:(id)sender +{ +  Threshold* threshold = nil; +  NSError* commitError = nil; +  if (self.thresholdObjectIndex >= 0) +  { +    threshold = [self.configuration.thresholds objectAtIndex:self.thresholdObjectIndex]; +  } +  else +  { +    threshold = [(AppDelegate*) [[UIApplication sharedApplication] delegate] createThreshold]; +    [self.configuration addThresholdsObject:threshold]; +  } +   +  if (threshold != nil) +  { +    threshold.name = self.thresholdNameTextField.text; +    threshold.value = [NSNumber numberWithDouble:self.thresholdValueStepper.value]; +    threshold.enabled = [NSNumber numberWithBool:self.thresholdEnabledSwitch.on]; +     +    //Commit changes and save succeeds then return to list of thresholds. +    commitError = [(AppDelegate*) [[UIApplication sharedApplication] delegate] save]; +  } +   +  if (threshold == nil || commitError != nil) +  { +    //Rollback & present error! +    [(AppDelegate*) [[UIApplication sharedApplication] delegate] rollback]; +     +    UIAlertView *commitThresholdAlert = [[UIAlertView alloc] initWithTitle:@"Save error!" message:@"iBean was unable to save threshold!\nPlease try again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; +    [commitThresholdAlert show]; +  } +  else +  { +    [self.navigationController popViewControllerAnimated:YES]; +  } +}  /*****************************************************   Delegates   *****************************************************/ +//Purpose: When "return" is pressed the keyboard will go away and "change" event will be triggered. +- (BOOL)textFieldShouldReturn:(UITextField *)textField +{ +  //Return key makes the keyboard go away. +  if (textField == self.thresholdNameTextField) +  { +    [textField resignFirstResponder]; +    return YES; +  } +   +  return NO; +}  @end diff --git a/iBean/iBean/iPhoneStoryboard.storyboard b/iBean/iBean/iPhoneStoryboard.storyboard index 683bc9f..cec0cd1 100644 --- a/iBean/iBean/iPhoneStoryboard.storyboard +++ b/iBean/iBean/iPhoneStoryboard.storyboard @@ -286,7 +286,7 @@                                              <constraint firstItem="8gp-G0-eVi" firstAttribute="top" secondItem="noJ-aA-kKf" secondAttribute="top" constant="11" id="RKe-IJ-EL2"/>                                          </constraints>                                          <connections> -                                            <segue destination="XZe-6y-tUN" kind="push" id="vNf-1Q-64U"/> +                                            <segue destination="XZe-6y-tUN" kind="push" identifier="SettingsThresholdSegue" id="vNf-1Q-64U"/>                                          </connections>                                      </tableViewCell>                                  </cells> @@ -371,7 +371,11 @@                              </tableView>                              <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ixE-eI-jK9">                                  <items> -                                    <barButtonItem systemItem="edit" id="pfh-Br-yHh"/> +                                    <barButtonItem systemItem="edit" id="pfh-Br-yHh"> +                                        <connections> +                                            <action selector="toggleEditMode:" destination="XZe-6y-tUN" id="7ax-FO-rsP"/> +                                        </connections> +                                    </barButtonItem>                                      <barButtonItem style="plain" systemItem="flexibleSpace" id="QcW-iO-KPT"/>                                      <barButtonItem systemItem="add" id="Hw8-N9-QUf">                                          <connections> @@ -393,6 +397,11 @@                          </constraints>                      </view>                      <navigationItem key="navigationItem" title="Thresholds" id="g7z-WC-gGh"/> +                    <connections> +                        <outlet property="thresholdListBottomToolbar" destination="ixE-eI-jK9" id="ozU-hU-IYT"/> +                        <outlet property="thresholdListEditButton" destination="pfh-Br-yHh" id="pK0-WR-tae"/> +                        <outlet property="thresholdListTableView" destination="hI0-rM-L5l" id="1je-zh-DDw"/> +                    </connections>                  </viewController>                  <placeholder placeholderIdentifier="IBFirstResponder" id="2Uy-KG-psE" userLabel="First Responder" sceneMemberID="firstResponder"/>              </objects> @@ -416,13 +425,16 @@                                              <rect key="frame" x="10" y="1" width="300" height="43"/>                                              <autoresizingMask key="autoresizingMask"/>                                              <subviews> -                                                <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="nJO-Vo-PIR"> +                                                <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Descriptive name of threshold goes here" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="nJO-Vo-PIR">                                                      <constraints> -                                                        <constraint firstAttribute="width" constant="260" id="XOl-1f-qtC"/> +                                                        <constraint firstAttribute="width" constant="260" id="C3o-PY-diC"/>                                                          <constraint firstAttribute="height" constant="30" id="nXA-Jn-d5M"/>                                                      </constraints>                                                      <fontDescription key="fontDescription" type="system" pointSize="14"/>                                                      <textInputTraits key="textInputTraits" returnKeyType="done"/> +                                                    <connections> +                                                        <outlet property="delegate" destination="0Fo-5M-9Kc" id="XQI-QU-ohX"/> +                                                    </connections>                                                  </textField>                                              </subviews>                                              <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> @@ -451,7 +463,7 @@                                                      <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>                                                      <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>                                                  </label> -                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Threshold value" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Dth-cf-hBc"> +                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Dth-cf-hBc">                                                      <constraints>                                                          <constraint firstAttribute="height" constant="21" id="C26-OZ-vR9"/>                                                      </constraints> @@ -459,7 +471,11 @@                                                      <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>                                                      <color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>                                                  </label> -                                                <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="100" translatesAutoresizingMaskIntoConstraints="NO" id="FfU-8X-ael"/> +                                                <stepper opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" maximumValue="1000000" translatesAutoresizingMaskIntoConstraints="NO" id="FfU-8X-ael"> +                                                    <connections> +                                                        <action selector="valueStepperChanged:" destination="0Fo-5M-9Kc" eventType="valueChanged" id="VZF-S2-nBq"/> +                                                    </connections> +                                                </stepper>                                              </subviews>                                              <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>                                          </view> @@ -505,8 +521,18 @@                          </connections>                      </tableView>                      <navigationItem key="navigationItem" title="Threshold" id="Ozv-hq-I7e"> -                        <barButtonItem key="rightBarButtonItem" systemItem="save" id="cAv-1a-lwW"/> +                        <barButtonItem key="rightBarButtonItem" systemItem="save" id="cAv-1a-lwW"> +                            <connections> +                                <action selector="commitThreshold:" destination="0Fo-5M-9Kc" id="4G9-19-uTP"/> +                            </connections> +                        </barButtonItem>                      </navigationItem> +                    <connections> +                        <outlet property="thresholdEnabledSwitch" destination="sja-Le-4gL" id="KnO-wm-qa9"/> +                        <outlet property="thresholdNameTextField" destination="nJO-Vo-PIR" id="N4U-un-QTr"/> +                        <outlet property="thresholdValueLabel" destination="Dth-cf-hBc" id="T0F-ci-Xqi"/> +                        <outlet property="thresholdValueStepper" destination="FfU-8X-ael" id="tbI-6k-Ic6"/> +                    </connections>                  </tableViewController>                  <placeholder placeholderIdentifier="IBFirstResponder" id="x2h-49-oUN" userLabel="First Responder" sceneMemberID="firstResponder"/>              </objects> @@ -1013,7 +1039,7 @@                                          </constraints>                                          <prototypes>                                              <tableViewCell contentMode="scaleToFill" selectionStyle="blue" indentationWidth="10" reuseIdentifier="BeanCell" rowHeight="60" id="GFY-k6-GqL" customClass="BeanCell"> -                                                <rect key="frame" x="0.0" y="46" width="320" height="61"/> +                                                <rect key="frame" x="0.0" y="46" width="320" height="62"/>                                                  <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>                                                  <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">                                                      <rect key="frame" x="10" y="1" width="300" height="59"/> @@ -1287,6 +1313,7 @@          <class className="ThresholdCell" superclassName="UITableViewCell">              <source key="sourceIdentifier" type="project" relativePath="./Classes/ThresholdCell.h"/>              <relationships> +                <relationship kind="action" name="switchChanged:"/>                  <relationship kind="outlet" name="enabledSwitch" candidateClass="UISwitch"/>                  <relationship kind="outlet" name="nameLabel" candidateClass="UILabel"/>                  <relationship kind="outlet" name="valueLabel" candidateClass="UILabel"/> @@ -1294,9 +1321,23 @@          </class>          <class className="ThresholdListViewController" superclassName="UIViewController">              <source key="sourceIdentifier" type="project" relativePath="./Classes/ThresholdListViewController.h"/> +            <relationships> +                <relationship kind="action" name="toggleEditMode:"/> +                <relationship kind="outlet" name="thresholdListBottomToolbar" candidateClass="UIToolbar"/> +                <relationship kind="outlet" name="thresholdListEditButton" candidateClass="UIBarButtonItem"/> +                <relationship kind="outlet" name="thresholdListTableView" candidateClass="UITableView"/> +            </relationships>          </class>          <class className="ThresholdViewController" superclassName="UITableViewController">              <source key="sourceIdentifier" type="project" relativePath="./Classes/ThresholdViewController.h"/> +            <relationships> +                <relationship kind="action" name="commitThreshold:"/> +                <relationship kind="action" name="valueStepperChanged:"/> +                <relationship kind="outlet" name="thresholdEnabledSwitch" candidateClass="UISwitch"/> +                <relationship kind="outlet" name="thresholdNameTextField" candidateClass="UITextField"/> +                <relationship kind="outlet" name="thresholdValueLabel" candidateClass="UILabel"/> +                <relationship kind="outlet" name="thresholdValueStepper" candidateClass="UIStepper"/> +            </relationships>          </class>      </classes>      <simulatedMetricsContainer key="defaultSimulatedMetrics"> @@ -1305,8 +1346,8 @@          <simulatedScreenMetrics key="destination" type="retina4"/>      </simulatedMetricsContainer>      <inferredMetricsTieBreakers> -        <segue reference="EsA-2d-QNt"/> -        <segue reference="CyX-df-8ge"/>          <segue reference="utz-eo-nc3"/> +        <segue reference="CyX-df-8ge"/> +        <segue reference="qk2-F5-M1s"/>      </inferredMetricsTieBreakers>  </document>
\ No newline at end of file | 
