Привет @ user7897479 и добро пожаловать.
Я бы рекомендовал использовать класс "UnitConversion" для хранения всей необходимой информации о единицах и выполнения преобразований для вас.Это разделяет обязанности так, что ваш ViewController действительно несет ответственность только за передачу данных между классами преобразования UI Elements <->.
Еще одна вещь, которую я хотел бы упомянуть, прежде чем перейти к полному ответу:
Именование очень важно!Пожалуйста, дайте осмысленные имена вашим свойствам / методам / объектам / классам - это поможет не только другим, которые смотрят на ваш код, но и самим его поддерживать, поддерживая его
Глядя на это без особого представления о вашем интерфейсе, Я понятия не имею, для чего предназначены txtbox1,2,3,4, или для этого типа строк pd, pd2 (если я просто смотрю на них без определенных литералов).
Хорошо, нанекоторый код:
UnitConversion.h:
#import <Foundation/Foundation.h>
typedef enum : NSUInteger {
UnitConversionTypeFarenheightToCelsius,
UnitConversionTypeFeetToInches,
UnitConversionTypeGramsToKilograms,
} UnitConversionType;
NS_ASSUME_NONNULL_BEGIN
@interface UnitConversion : NSObject
- (instancetype _Nullable)initWithUnitConversionType:(UnitConversionType)type;
- (NSString *)nameForConvertFromUnit;
- (NSString *)nameForConvertToUnit;
- (NSString *)runConversionOnValue:(float)value;
@end
NS_ASSUME_NONNULL_END
UnitConversion.m:
#import "UnitConversion.h"
typedef enum : NSUInteger {
ConversionUnitFarenheit,
ConversionUnitFeet,
ConversionUnitGrams,
ConversionUnitCelsius,
ConversionUnitInches,
ConversionUnitKilograms,
} ConversionUnit;
@interface UnitConversion()
@property ConversionUnit convertFromUnit;
@property ConversionUnit convertToUnit;
@property UnitConversionType conversionType;
@property float valueToConvert;
@end
@implementation UnitConversion
- (instancetype _Nullable)initWithUnitConversionType:(UnitConversionType)type {
self = [super init];
if (self) {
_conversionType = type;
switch (type) {
case UnitConversionTypeFarenheightToCelsius: {
_convertFromUnit = ConversionUnitFarenheit;
_convertToUnit = ConversionUnitCelsius;
break;
}
case UnitConversionTypeFeetToInches: {
_convertFromUnit = ConversionUnitFeet;
_convertToUnit = ConversionUnitInches;
break;
}
case UnitConversionTypeGramsToKilograms: {
_convertFromUnit = ConversionUnitGrams;
_convertToUnit = ConversionUnitKilograms;
break;
}
default:
break;
}
}
return self;
}
- (NSString *)runConversionOnValue:(float)value {
self.valueToConvert = value;
NSString *convertedValue = @"Undefined";
switch (self.conversionType) {
case UnitConversionTypeFarenheightToCelsius:
convertedValue = [self _convertFarenheightToCelsius];
break;
case UnitConversionTypeFeetToInches:
convertedValue = [self _convertFeetToInches];
break;
case UnitConversionTypeGramsToKilograms:
convertedValue = [self _convertGramsToKilograms];
break;
default:
break;
}
return convertedValue;
}
- (NSString *)_convertFarenheightToCelsius {
return [NSString stringWithFormat:@"%.2f", (self.valueToConvert - 32.0f) * (5.0f/9.0f)];
}
- (NSString *)_convertFeetToInches {
return [NSString stringWithFormat:@"%.2f", self.valueToConvert / 12.0f];
}
- (NSString *)_convertGramsToKilograms {
return [NSString stringWithFormat:@"%.2f", self.valueToConvert / 1000.0f];
}
- (NSString *)nameForConvertFromUnit {
return [self _nameForConversionUnit:self.convertFromUnit];
}
- (NSString *)nameForConvertToUnit {
return [self _nameForConversionUnit:self.convertToUnit];
}
- (NSString *)_nameForConversionUnit:(ConversionUnit)unit {
NSString *unitName = @"Default Unit";
switch (unit) {
case ConversionUnitFarenheit: {
unitName = @"Farenheit";
break;
}
case ConversionUnitFeet: {
unitName = @"Feet";
break;
}
case ConversionUnitGrams: {
unitName = @"Grams";
break;
}
case ConversionUnitCelsius: {
unitName = @"Celsius";
break;
}
case ConversionUnitInches: {
unitName = @"Inches";
break;
}
case ConversionUnitKilograms: {
unitName = @"Kilograms";
break;
}
default:
break;
}
return unitName;
}
@end
ConversionViewController.m:
#import "ConversionViewController.h"
#import "UnitConversion.h"
@interface ConversionViewController () <UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate>
@property (strong, nullable) IBOutlet UIPickerView *conversionPicker;
@property (strong, nullable) NSArray <UnitConversion *> *unitConversionArray;
@property (strong, nullable) IBOutlet UILabel *convertFromLabel;
@property (strong, nullable) IBOutlet UILabel *convertToLabel;
@property (strong, nullable) IBOutlet UITextField *convertFromValue;
@property (strong, nullable) IBOutlet UITextField *convertToValue;
@end
@implementation ConversionViewController
- (void)viewDidLoad {
[super viewDidLoad];
// setup the conversion we want to do and put them into our data structure
UnitConversion *degreesConversion = [[UnitConversion alloc] initWithUnitConversionType:UnitConversionTypeFarenheightToCelsius];
UnitConversion *inchesToFeet = [[UnitConversion alloc] initWithUnitConversionType:UnitConversionTypeFeetToInches];
UnitConversion *gramsToKilo = [[UnitConversion alloc] initWithUnitConversionType:UnitConversionTypeGramsToKilograms];
self.unitConversionArray = @[degreesConversion, inchesToFeet, gramsToKilo];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// by default select the first row
[self.conversionPicker selectRow:0 inComponent:0 animated:NO];
}
- (IBAction)convert:(id)sender {
NSInteger pickerRow = [self.conversionPicker selectedRowInComponent:0];
if (pickerRow >= 0) {
// grab our associated UnitConversion based on our backing unit conversion array
// the index matches up with the index selected for the picker row
UnitConversion *conversion = [self.unitConversionArray objectAtIndex:pickerRow];
// run the conversion
NSString *convertedValue = [conversion runConversionOnValue:[self.convertFromValue.text floatValue]];
// set the converted value to our result field
self.convertToValue.text = convertedValue;
}
}
- (NSInteger)numberOfComponentsInPickerView:(nonnull UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(nonnull UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return 3;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
// clear out our input and output fields
self.convertFromValue.text = @"";
self.convertToValue.text = @"";
// set the labels to alpha 0 because we going to fade in the change
self.convertFromLabel.alpha = 0.0f;
self.convertToLabel.alpha = 0.0f;
// determine which conversion is selected from the picker view
UnitConversion *conversion = [self.unitConversionArray objectAtIndex:row];
// set our labels to reflect that
self.convertFromLabel.text = [conversion nameForConvertFromUnit];
self.convertToLabel.text = [conversion nameForConvertToUnit];
// now animate the fade in of our label names
[UIView animateWithDuration:0.2 animations:^{
self.convertFromLabel.alpha = 1.0f;
self.convertToLabel.alpha = 1.0f;
}];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
// our titles should be in the form of "Feet to Inches"
UnitConversion *conversion = [self.unitConversionArray objectAtIndex:row];
return [NSString stringWithFormat:@"%@ to %@", [conversion nameForConvertFromUnit], [conversion nameForConvertToUnit]];
}
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// only allow numbers decimal and negative
NSCharacterSet *numbersOnly = [NSCharacterSet characterSetWithCharactersInString:@"0123456789.-"];
NSCharacterSet *characterSetFromTextField = [NSCharacterSet characterSetWithCharactersInString:textField.text];
// don't allow the text field to change if the user attempts to input something else
BOOL stringIsValid = [numbersOnly isSupersetOfSet:characterSetFromTextField];
return stringIsValid;
}
@end
Вотпример того, что этот Код производит после генерации простого интерфейса:
![Conversion Example](https://i.stack.imgur.com/eqJMz.gif)
Хотя это выглядит как излишнее для примера, это делает его намного прощеразверните его (например, если вы хотите добавить дополнительные типы преобразования или повторно использовать класс преобразования в другом месте).