UIPickerView 不加载行

Posted

技术标签:

【中文标题】UIPickerView 不加载行【英文标题】:UIPickerView not loading rows 【发布时间】:2016-08-25 10:45:17 【问题描述】:

目前正在开发一个使用 CoreData 发现火车的应用程序。基本上,每列火车都存储有一组相应的目击记录。当用户看到火车时,他们会记录一次目击事件,并且该目击事件与火车序列号相关联(只是基本数据关系)

我正在尝试用序列号填充UIPickerView,但是我遇到了一些困难。我计划多次使用这个特定的 PickerView,所以它有自己的类并且不在 ViewController 中实现。

我已正确设置委托和数据源,但从未填充 PickerView。从每个函数中的NSLogprintf 代码中,我可以看出titleForRow 从未被调用过,numberOfRowsInComponent 也不会被调用这是我的UIPickerView 类代码:

-(id)init

    //init super class.
    self = [super init];

    //get allocate array reader (TrainSightingReaderWriter) then set the array that this picker will be getting data from.
    [self setArrayReader:[[TrainSightingReaderWriter alloc] init]];
    [self setArray: [[self arrayReader] getTrainSerialArray]];

    NSLog(@"INIT PickerView");

    //return this object.
    return self;


-(int)numberOfComponentsInPickerView:(UIPickerView *)pickerView

    printf("At component counter\n");
    return 1;


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

    printf("At counter. %d is output\n", _array.count);
    return _array.count;


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

    NSLog(@"Returning a value.");
    return [self array][row];

ViewController 代码:

- (void)viewDidLoad

    [super viewDidLoad];
    NSLog(@"We have made it to the AddSightVC.");
    TrainPicker * mypicker;
    mypicker = [[TrainPicker alloc]init];


    //ISSUES
    _trainPickerScroller.delegate = mypicker;
    _trainPickerScroller.dataSource = mypicker;

    [_trainPickerScroller reloadAllComponents];
    [_trainPickerScroller reloadInputViews];

    // Do any additional setup after loading the view.

【问题讨论】:

TrainPicker 是什么?还有你在哪里初始化_trainPickerScroller TrainPicker 是我的 UIPickerView 类,如下所示:@interface TrainPicker : UIPickerView <UIPickerViewDelegate, UIPickerViewDataSource>_trainPickerScroller 是选择器本身的出口。 这似乎很奇怪,您有 2 个选择器视图,一个仅用作数据源?无论如何,我想问题是您没有强烈引用 mypicker 并且它正在被释放。 【参考方案1】:

TrainPicker 需要是视图控制器的实例变量,以便它不会被垃圾收集(在 .h 作为属性或在 .m 文件的接口部分中)。如果您使用 ARC,在 viewDidLoad 中为其创建一个局部变量将导致它被垃圾回收。

【讨论】:

谢谢!!在我的头文件中将其设置为@property,这已经奏效了。

以上是关于UIPickerView 不加载行的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 未加载 [重复]

UIPicker 检测当前选定行上的点击

允许用户通过点击来选择 UIPickerView 行

设置 UIPickerView 行的背景颜色

UIPickerView 不加载行

获取 UIPicker 第一行的值