Jump to content



Photo

iOS measurement conversion app with picker

ios

  • Please log in to reply
5 replies to this topic

#1 WesFromIS

WesFromIS

    Neowinian

  • Joined: 07-December 12
  • Location: Dillsboro, NC

Posted 10 December 2012 - 14:29

I am building a simple measurement conversion tool (cups to ounces, tsp to tbsp) with a picker (I'd like to use a drop down, but no luck there).

My app launches. The picker populates with options from the datasource.

How ever when I select an option, the app crashes with the following console output

2012-12-10 09:26:41.068 Cooks Helper2[63484:11303] -[UIView text]: unrecognized selector sent to instance 0x7188720
(lldb)

Here are my classes

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
	    <UIPickerViewDelegate, UIPickerViewDataSource>
@property (strong, nonatomic) NSArray *conversionType;
@property (strong, nonatomic) NSArray *conversionFactor;
@property (strong, nonatomic) IBOutlet UIView *picker;
@property (strong, nonatomic) IBOutlet UITextField *originalText;
@property (strong, nonatomic) IBOutlet UILabel *resultText;
- (IBAction)textFieldReturn:(id)sender;
@end

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize picker, originalText, resultText;
- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    _conversionType = @[@"Ounces to Cups", @"Cups to Ounces",
    @"Teaspoons to Tablespoons", @"Tablespoons to Teaspoons"];
   
    _conversionFactor = @[ @0.25f, @4.00f, @0.33f, @3.00f];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction)textFieldReturn:(id)sender
{
    [sender resignFirstResponder];
}
#pragma mark -
#pragma mark PickerView Datasource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return _conversionType.count;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return _conversionType[row];
}
#pragma mark -
#pragma mark PickerView Delegate
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    float factor = [_conversionFactor[row] floatValue];
    float original = [originalText.text floatValue];
    float result = original * factor;
   
    NSString *resultString = [[NSString alloc] initWithFormat:
							  @"%.2f", result];
    resultText.text = resultString;
}
@end

Thanks for any help you can offer :)


#2 OP WesFromIS

WesFromIS

    Neowinian

  • Joined: 07-December 12
  • Location: Dillsboro, NC

Posted 10 December 2012 - 19:13

Okay, so I have the picker issue sorted out, I think. I did the referencing outlet incorrectly. Apparently, I had right clicked just outside of the text field, so it was a UIView object instead of a UITextField. My guess it was trying to pull the text attribute from the viewcontroller itself, which obviously, there is none. I have "remedied" that by correcting a new RO to viewcontroller.h and deleteing the old one, but now the application won't launch. Crashes with the following

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ViewController 0x13335740> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key originalText


#3 El Marto

El Marto

    Serial Lurker

  • Joined: 07-October 04
  • Location: Bucks, England

Posted 11 December 2012 - 08:29

You have an extra hook set up in your nib somewhere. Maybe you renamed an outlet property or something. Go to the connections tab (last one) on the right in IB and you should see whats up.

#4 OP WesFromIS

WesFromIS

    Neowinian

  • Joined: 07-December 12
  • Location: Dillsboro, NC

Posted 11 December 2012 - 15:41

You have an extra hook set up in your nib somewhere. Maybe you renamed an outlet property or something. Go to the connections tab (last one) on the right in IB and you should see whats up.


Thanks for the reply! Figured it out late last night. Thanks for your help!

#5 El Marto

El Marto

    Serial Lurker

  • Joined: 07-October 04
  • Location: Bucks, England

Posted 11 December 2012 - 20:03

No problem. Is there a particular reason you are declaring a property and then only using the instance variable. For example:

- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return _conversionType.count;
}

Ideally would be
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return self.conversionType.count;
}

This uses the getter created by the system when you declare a property.

#6 OP WesFromIS

WesFromIS

    Neowinian

  • Joined: 07-December 12
  • Location: Dillsboro, NC

Posted 12 December 2012 - 18:39

No problem. Is there a particular reason you are declaring a property and then only using the instance variable. For example:

- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
	return _conversionType.count;
}

Ideally would be
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
	return self.conversionType.count;
}

This uses the getter created by the system when you declare a property.


No reason really. I'm actually pretty new to iOS programming, and used a tutorial online for parts of this. That was how it was written in the tutorial. Thanks for the input though. I appreciate it!