2016-08-25 8 views
0

Momentan arbeitet man an einer App, um Züge mit CoreData zu entdecken. Grundsätzlich wird jeder Zug mit einem entsprechenden Sichtungssatz gespeichert. Wenn ein Benutzer einen Zug sieht, protokolliert er eine Sichtung und diese Sichtung wird an eine Seriennummer geknüpft (nur grundlegende Datenbeziehungen)UIPickerView lädt keine Zeilen

Ich versuche, eine UIPickerView mit Seriennummern zu bevölkern, aber ich laufe in einige Schwierigkeiten. Ich plane, diese spezifische PickerView mehrere Male zu verwenden, so dass es eine eigene Klasse hat und nicht in ViewController implementiert ist.

Ich habe die Delegat und dataSource korrekt festgelegt, aber die PickerView wird nie aufgefüllt. Vom NSLog und printf-Code, der in jeder Funktion ist, kann ich sagen, dass titleForRow nie aufgerufen wird, und keiner ist numberOfRowsInComponent Hier ist mein Code für die UIPickerView Klasse:

-(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 Code:

- (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. 
} 
+0

Was ist 'TrainPicker'? Wo initialisierst du '_trainPickerScroller'? –

+0

'TrainPicker' ist meine Klasse für das' UIPickerView' wie folgt: '@interface TrainPicker: UIPickerView '. '_trainPickerScroller' ist der Ausgang zum Picker selbst. – Swemoph

+0

Das scheint seltsam, Sie haben 2 Picker-Ansichten, eine, die nur als Datenquelle verwendet wird? Wie auch immer, ich schätze, das Problem ist, dass du keinen starken Bezug zu "mypicker" hast und es wird freigegeben. –

Antwort

1

TrainPicker muss eine Instanzvariable für den Ansichtscontroller sein, damit keine Speicherbereinigung stattfindet (entweder in der Eigenschaft .h als Eigenschaft oder in einem Schnittstellenabschnitt in der .m-Datei). Wenn Sie eine lokale Variable in viewDidLoad dafür erstellen, wird sie als Garbage Collected erfasst, wenn Sie ARC verwenden.

+0

Danke !! Richte es als '@ Eigenschaft' in meiner Header-Datei ein, und das hat funktioniert. – Swemoph