• 0

iOS measurement conversion app with picker


Question

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)
[/CODE]

Here are my classes

[CODE]
#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
[/CODE]

[CODE]
#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
[/CODE]

Thanks for any help you can offer :)

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

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
[/CODE]

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

  • 0

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!

Link to comment
Share on other sites

  • 0

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;
}
[/CODE]

Ideally would be

[CODE]
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return self.conversionType.count;
}
[/CODE]

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

Link to comment
Share on other sites

  • 0

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;
}
[/CODE]

Ideally would be

[CODE]
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return self.conversionType.count;
}
[/CODE]

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!

Link to comment
Share on other sites

This topic is now closed to further replies.