同一iOS视图上有两个UIPickerView,但值显示为问号

时间:2015-07-20 01:46:40

标签: ios objective-c uipickerview

我正在制作单一视图iOS应用程序。我有两个UIPickerView元素,并在for循环中初始化它们,为每个元素创建一堆字符串。我在viewDidLoad上隐藏其中一个,因为我打算在它们之间切换。正在显示的那个显示"?"对于每一行而不是正确的字符串。

viewcontroller.h位于

之下
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate>
{
    IBOutlet NSMutableArray *milesArray;
    IBOutlet NSMutableArray *metersArray;
}

@property (weak, nonatomic) IBOutlet UITextField *distanceText;
@property (weak, nonatomic) IBOutlet UISegmentedControl *distanceUnits;
@property (weak, nonatomic) IBOutlet UITextField *timeText;
@property (weak, nonatomic) IBOutlet UILabel *splitLabel;
@property (weak, nonatomic) IBOutlet UITextField *meterText;
@property (weak, nonatomic) IBOutlet UITextField *feetText;
@property (weak, nonatomic) IBOutlet UITextField *inchesText;
@property (strong, nonatomic) IBOutlet UIPickerView *meterPicker;
@property (strong, nonatomic) IBOutlet UIPickerView *milePicker;

- (IBAction)backgroundTap:(id)sender;
- (IBAction)textFieldDidEndEditing:(UITextField *)textField;

@end

viewcontroller.m是下一个

#import "ViewController.h"
#import <math.h>

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    milesArray = [[NSMutableArray alloc] init];
    metersArray = [[NSMutableArray alloc] init];

    _meterText.text = @"0";
    _feetText.text = @"0";
    _inchesText.text = @"0";
    _distanceText.text = @"0";
    _timeText.text = @"00:00:00.00";

    _milePicker.hidden = YES;
    //set picker data
    for(int i = 0; i < 1000; i++)
    {
        NSString *str = [NSString stringWithFormat:@"%d", (i+1)*100];

        [metersArray addObject:str];

        NSString *str1 = [NSString stringWithFormat:@"%0.1f", (i+1)*0.1];

        [milesArray addObject:str1];
    }

    self.meterPicker.dataSource = self;
    self.milePicker.delegate = self;
}

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

- (IBAction)backgroundTap:(id)sender{
    [self.view endEditing:(YES)];
}


// The number of columns of data
- (long)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

// The number of rows of data
- (long)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if(pickerView.tag == 6)
    {
        return metersArray.count;
    }
    else if(pickerView.tag == 7)
    {
        return milesArray.count;
    }
    else
        return 0;
}

// The data to return for the row and component (column) that's being passed in
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if(pickerView.tag == 6)
    {
        return metersArray[row];
    }
    else if(pickerView.tag == 7)
    {
        return milesArray[row];
    }

    else
        return @"error";
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    long index = row;

    _splitLabel.text = [NSString stringWithFormat: @"%ld", index];
}
@end

我认为当你有两个而不是只有一个uipickerview时,它与初始化它们有关。我可能做错了。

先谢谢,我希望一切都很清楚。

2 个答案:

答案 0 :(得分:0)

我在您的代码中看到两个错误:

  1. 在.h中,您正在使用IBOutlet初始化NSArras。为什么?它们应该只是if (usernameRequest.responseText.trim() == "ok")
  2. 没那么糟糕,在.h中,采摘者应该都是弱势属性。
  3. 我希望第一个错误可以解决您的问题,但我不确定。

答案 1 :(得分:0)

一个大问题是viewDidLoad中的以下两行:

self.meterPicker.dataSource = self;
self.milePicker.delegate = self;

您没有为里程选择器设置dataSource,也没有为仪表选择器设置delegate

你想:

self.meterPicker.dataSource = self;
self.meterPicker.delegate = self;
self.milePicker.dataSource = self;
self.milePicker.delegate = self;

更好的是,只使用一个选择器视图。当您希望在英里和米之间切换时,只需重新加载一个选择器视图并设置两个委托方法,以便根据当前模式使用正确的阵列。