Как выполнить цикл if, когда я нажимаю цель конвертировать c, xcode - PullRequest
0 голосов
/ 21 сентября 2018

Это мой .h файл в xcode

//
//  PickerViewController.h
//  Picker
//
//  Created by jitin on 9/14/14.
//  Copyright (c) 2014 jitin. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface PickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {


    IBOutlet UIPickerView *picker;
}

@property (nonatomic, retain) UIPickerView *picker;
@property (weak, nonatomic) IBOutlet UITextField *txtbox1;
@property (weak, nonatomic) IBOutlet UITextField *txtbox2;
@property (weak, nonatomic) IBOutlet UITextField *txtbox3;
@property (weak, nonatomic) IBOutlet UITextField *txtbox4;

-(IBAction)convert:(id)sender;



@end

Это мой .m файл с использованием xcode

//
//  PickerViewController.m
//  Picker
//
//  Created by jitin on 9/14/14.
//  Copyright (c) 2014 jitin. All rights reserved.
//

#import "PickerViewController.h"

@interface PickerViewController ()

@end

@implementation PickerViewController

@synthesize picker;
@synthesize txtbox1, txtbox2, txtbox3, txtbox4;

static NSString *pd[3] = {@"Farenheit", @"Feet", @"Grams"};
static NSString *pd2[3] = {@"Celcius", @"Inches", @"Kilograms"};



- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark UIPickerViewDelegate & UIPickerViewDataSource methods

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return 3;
}

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
    return pd[row];
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{

    NSLog(@"didSelectRow: %li, inComponent: %li", row, (long)component);
    self.txtbox1.text = pd[row];
    self.txtbox2.text = pd2[row];

}

#pragma mark Rotation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    NSLog(@"Current Row Select Value %li", [picker selectedRowInComponent:0]);
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

-(BOOL)shouldAutorotate {

    NSLog(@"Current Row Select Value %li", [picker selectedRowInComponent:0]);

    return YES;
}



-(IBAction)convert:(id)sender

{



    float inValue = [[txtbox3 text] floatValue];
    float outValue = ((inValue * (9.0f/5.0f)) + 32);

    [txtbox4 setText:[NSString stringWithFormat:@"%3.2f", outValue]];





}

@end

Мой вопрос о методе / функции конвертации в моем .mфайл.Я хочу сделать цикл if в зависимости от того, какая строка выбрана в окне выбора.например.если выбрана строка 0, конвертация будет в градусы Фаренгейта в градусы Цельсия.если выбрана строка 1, при нажатии кнопки конвертирования конвертация будет в футах в дюймы.Я знаю, что должен использовать цикл if.Но у меня возникают проблемы с тем, что вызывать в этом цикле if, чтобы мои операторы выполнялись правильно.Еще одна заметка.Я еще не реализовал свои футы в дюймы и пересчет в граммы в килограммы.Я просто хочу, чтобы мой цикл if работал первым.

1 Ответ

0 голосов
/ 21 сентября 2018

Привет @ 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

Хотя это выглядит как излишнее для примера, это делает его намного прощеразверните его (например, если вы хотите добавить дополнительные типы преобразования или повторно использовать класс преобразования в другом месте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...