在 Xcode 中为两个相同的选择器组件指定数组

Posted

技术标签:

【中文标题】在 Xcode 中为两个相同的选择器组件指定数组【英文标题】:Specifying arrays for two identical picker components in Xcode 【发布时间】:2012-07-30 14:35:50 【问题描述】:

对于具有两个相同组件的选择器中的数组,此代码是否合适?或者两个组件可以以某种方式使用相同的数组?

    - (void)viewDidLoad

    self.fromArray = [[NSArray alloc] initWithObjects:
                      @"Annual", @"Monthly", @"48/Year", @"SemiMonthly", @"BiWeekly", @"Weekly", @"Hourly", nil];

    self.fromValues = [[NSArray alloc] initWithObjects: 
                       [NSNumber numberWithFloat:1.0],
                       [NSNumber numberWithFloat:12.0], 
                       [NSNumber numberWithFloat:48.0],
                       [NSNumber numberWithFloat:24.0], 
                       [NSNumber numberWithFloat:26.0],
                       [NSNumber numberWithFloat:52.0], 
                       [NSNumber numberWithFloat:2080.0], nil];


    self.toArray = [[NSArray alloc] initWithObjects:
                      @"Annual", @"Monthly", @"48/Year", @"SemiMonthly", @"BiWeekly", @"Weekly", @"Hourly", nil];

    self.toValues = [[NSArray alloc] initWithObjects: 
                     [NSNumber numberWithFloat:1.0],
                     [NSNumber numberWithFloat:12.0], 
                     [NSNumber numberWithFloat:48.0],
                     [NSNumber numberWithFloat:24.0], 
                     [NSNumber numberWithFloat:26.0],
                     [NSNumber numberWithFloat:52.0], 
                     [NSNumber numberWithFloat:2080.0], nil];

另外,如何使用来自组件和文本字段的值正确格式化计算?这是行不通的。

我试过了,但使用“行”时出现未声明的标识符错误。

- (NSString *)pickerView:(UIPickerView *)pickerView
             titleForRow:(NSInteger)row
            forComponent:(NSInteger)component

    if (component == 0) 
        return [fromArray objectAtIndex:row];
    
    return [toArray objectAtIndex:row];
 
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
      inComponent:(NSInteger)component 


- (IBAction)Convert:(id)sender 
    float valuein = [[fromValues objectAtIndex:row] floatValue];
    float valueout = [[toValues objectAtIndex:row] floatValue];
    float input = [inputText.text floatValue];
    float result = input * valuein / valueout;
    NSString *resultString = [[NSString alloc] initWithFormat: @"$ %@", [toArray objectAtIndex:row]];
    resultText.text = [NSString stringWithFormat:@"$%6.2f",result];

编辑:这是完整 .m 文件代码的当前版本,如下所示。我怀疑有一些不必要的代码。唯一的警告是未使用的变量“resultString”。

#import "PayFrequencyViewController.h"

@interface PayFrequencyViewController ()

@end

@implementation PayFrequencyViewController
@synthesize payPicker;
@synthesize toArray;
@synthesize fromArray;
@synthesize toValues;
@synthesize fromValues;
@synthesize resultText;
@synthesize inputText;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    self.fromArray = [[NSArray alloc] initWithObjects:
                      @"Annual", @"Monthly", @"48/Year", @"SemiMonthly", @"BiWeekly", @"Weekly", @"Hourly", nil];

    self.fromValues = [[NSArray alloc] initWithObjects: 
                       [NSNumber numberWithFloat:1.0],
                       [NSNumber numberWithFloat:12.0], 
                       [NSNumber numberWithFloat:48.0],
                       [NSNumber numberWithFloat:24.0], 
                       [NSNumber numberWithFloat:26.0],
                       [NSNumber numberWithFloat:52.0], 
                       [NSNumber numberWithFloat:2080.0], nil];

    self.toArray = self.fromArray;
    self.toValues =  self.fromValues;

    [super viewDidLoad];
    inputText.keyboardType = UIKeyboardTypeDecimalPad;


- (void)viewDidUnload

    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.toArray = nil;
    self.fromArray = nil;
    self.resultText = nil;
    self.inputText = nil;


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    return YES;


- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 

    return 2;


- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 

    if (component == 0) 
        return [fromArray count];
    
    return [toArray count];


- (NSString *)pickerView:(UIPickerView *)pickerView
             titleForRow:(NSInteger)row
            forComponent:(NSInteger)component

    if (component == 0) 
        return [fromArray objectAtIndex:row];
    
    return [toArray objectAtIndex:row];
 

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
      inComponent:(NSInteger)component 
    _row = row;


- (IBAction)Convert:(id)sender 
//    float valuein = [[fromValues text] floatValue];
//    float valueout = [[toValues text] floatValue];
//    [resultText setText:[NSString stringWithFormat:@"%6.2f", result]];
//    [inputText resignFirstResponder]; 
    float valuein = [[fromValues objectAtIndex:_row] floatValue];
    float valueout = [[toValues objectAtIndex:_row] floatValue];
    float input = [inputText.text floatValue];
    float result = input * valuein / valueout;
    NSString *resultString = [[NSString alloc] initWithFormat: @"$ %@", [toArray objectAtIndex:_row]];
    resultText.text = [NSString stringWithFormat:@"$%6.2f",result];


- (IBAction)Clear:(id)sender 
    inputText.text = @"";
    resultText.text = @"";


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

    [inputText resignFirstResponder];

@end

【问题讨论】:

【参考方案1】:

好的,有几件事:

首先,您的数组正在泄漏内存,因为您 allocinit 没有释放它们(除非您使用 ARC,在这种情况下这很好)。

其次,如果你想让它们共享同一个数组,你为什么不做类似的事情

 self.toArray = self.fromArray;
 self.toValues =  self.fromValues;

?

如何使用来自组件和文本字段的值正确格式化计算?

你需要在这里更清楚,我不明白你在做什么。

但是,在您的第一段代码中: 在您尝试使用 row 时,它没有被定义。您可能需要了解variables and scope。

你为什么不在你的类@interface中创建一个实例变量_row

NSInteger _row;

并像

一样设置该变量
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
  inComponent:(NSInteger)component 
      _row = row;
 

那么,在需要的时候使用_row 吗?

至于最后一段代码,你想用 [fromValues text] 实现什么?

【讨论】:

感谢您的回复。我正在使用 Xcode v.4.3.2,它不再允许(或需要)发布它们。所以,我觉得我在那里很好。我修改了指定的数组代码。到现在为止还挺好。 (我以为有一种简单的方法可以做到。我只是不知道怎么做。) 至于计算,我找到了用于从单组件选择器进行计算的示例,而不是从双组件选择器进行计算。我会尝试你提出的建议,除非你认为我最好使用我展示的最后一段代码的变体。恐怕最后一点是我发现一些可以做我想要的事情并对其进行修改以适合我的实例,只是这次我迷路了。 如果需要,我会提供帮助,但需要更多详细信息。如果您没有其他问题,请将此答案标记为已接受。最后,Xcode 版本与内存管理关系不大,您可能需要检查项目设置中是否启用了 ARC。 感谢您提供帮助。我首先发起了这个请求here,但没有成功 - 可能是因为我试图在其中塞入太多信息。 底线是,我希望用户从 2 组件选择器的每一侧选择选项,在文本字段中输入一个数字,然后点击一个按钮。当他们这样做时,将显示基于数字和所选两个选项的值的计算结果。我修改了类似的样本来为我工作,但在这个过程中迷路了。我怀疑我需要找到更基本的代码来完成相同的事情,而不需要我不需要的部分。

以上是关于在 Xcode 中为两个相同的选择器组件指定数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIPickerView 中为两个不同的组件显示两种不同的对象类型?

如何在我的 podfile 中为我的 Xcode 项目指定多个目标?

iview中Select 选择器多选校验方法

xcode 8 w/jenkins xcode 插件,如何指定配置文件

是否可以在 Blazor 中为父组件和子组件指定两个不同的类型参数值?

为啥这个 SwiftUI Picker 代码不起作用?