2013-04-26 19 views
0

我在一個模式視圖中的視圖控制器中使用UIPickerView(如果這就是它的名稱)。 我讀過的所有地方[picker reloadAllComponents];在viewDidLoad應該做的伎倆,但它沒有。我已經覆蓋-(UIView*)viewForRow-方法,但我不認爲這應該是問題..在UIPickerView中加載數據之前,它出現

事情是,當viewController垂直彈出,選擇器是空的。直到我向下滾動,才能出現新的一行。但是,如果我將[picker reloadAllComponents];添加到viewDidAppear,那麼在viewController完成其介入動畫(垂直)後立即顯示數據。儘管這很煩人。我希望選取器在滑動時已經擁有數據。

我試着把reloadAllComponents都放在viewDidLoadviewWillAppear之間,但它不起作用。

我把一個NSLog放在委託方法中,它打印出正確的數據,它在視圖彈出之前就做到了,但爲什麼不顯示它呢?

我以前有過和tableViewController相同的問題,我認爲reloadData那麼做了,但爲什麼它不會在viewDidLoad中繪製我的視圖?它只做它,如果它被稱爲在viewDIDappear ..

代碼:

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 2; 
} 
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    if(component == TYPE1) 
     return [[con getTypes] count]; 

    else return 1; 

} 
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 
{ 
    UIView* newView = [[UIView alloc] init]; 

    //Create a label, put it on the left side of the view 
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(view.frame.origin.x + 5, view.frame.origin.y, view.frame.size.width-45, view.frame.size.height)]; 
    [label setText:[[[con getTypes] objectAtIndex:row] getName]]; 
    [newView addSubview:label];//add 

    //Create an imageview, put it on the right side of the view 
    UIImageView*imageViewType = [[UIImageView alloc] initWithFrame:CGRectMake(view.frame.origin.x+(view.frame.size.width-40), view.frame.origin.y, 40, 40)]; 
    [imageViewType setImage:[[[con getTypes] objectAtIndex:row] getImage]]; 
    [newView addSubview:imageViewType];//add 

    [label setBackgroundColor:[UIColor clearColor]]; 


    NSLog(@"%@", [[[con getTypes]objectAtIndex:row] getName]); 
    //This NSLog prints out the correct name for the top three items of the list 
    //-even when called from viewDidLoad, and even before the view appears, but 
    //the content never shows up in the picker unless I scroll or call it again in 
    //viewDidAppear.. 

    return newView; 
} 
+0

嘗試awakefromnib – amar 2013-04-26 10:56:35

+0

你在裝入UIPicker,NSMutableArray裏?如果是這樣,項目何時被添加到數組? – JDx 2013-04-26 10:59:51

+0

@JDx帶有一些對象的NSMutableArray。我以編程方式創建這個viewController並使用'initWithController:(Controller *)c'(自制),並且控制器已經包含可變數組。在我的init方法中,我使用'self = [storyboard instantiateViewControllerWithIdentifier:@「identifier」];'然後設置數據,是這個問題嗎?..我不這麼認爲..當我調用'reloadAllComponents'時'viewDidLoad'它打印出正確的文本(文本作爲選擇器應該顯示),但它不會顯示它,直到我向下滾動代表踢入什麼或什麼.. – Sti 2013-04-26 11:05:36

回答

1
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 
{ 
    UIView* newView; 

    if (view) 
     newView = view; 
    else { 
     newView = [[UIView alloc] initWithFrame:CGRectMake(0,0,250,50)]; // use some appropriate size hier. I just made some figures up which almost certainly will not work. 
     //Create a label, put it on the left side of the view 
     UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(5.0f, 0.0f, newView.frame.size.width-45, newView.frame.size.height)]; 
     [newView addSubview:label];//add 

    //Create an imageview, put it on the right side of the view 
     UIImageView*imageViewType = [[UIImageView alloc] initWithFrame:CGRectMake((newView.frame.size.width-40.0f), 0.0f, 40.0f, 40.0f)]; 
     [newView addSubview:imageViewType];//add 
    } 

    [label setText:[[[con getTypes] objectAtIndex:row] getName]]; 
    [label setBackgroundColor:[UIColor clearColor]]; 

    [imageViewType setImage:[[[con getTypes] objectAtIndex:row] getImage]]; 

    return newView; 
} 
+0

謝謝!它現在有效。我不得不修改代碼,例如'[label setText]'在if語句後無法訪問,所以如果其他人想知道,我通過'UILabel * label =(UILabel *) [[newView subviews] objectAtIndex:0];'。標籤'0',imageView'1'。棘手的部分是,這是不夠的!即使數據是在if語句之後設置的,顯然它在view = nil時不會被設置。所以通過在'else'中放入'[set setText]'和'setImage',它終於奏效了。而我最終使用的尺寸是(15,6,140,​​44)'。再次感謝! – Sti 2013-04-26 18:08:06

+0

雖然..當我想到它..我似乎很奇怪,其餘的行滾動後出現正確的時候,我從來沒有真正設置框架正確..魚腥.. – Sti 2013-04-26 18:12:30

+0

你初始化一個框架。這對應於兩步初始化和設置幀。除非框架改變,否則,就我所見,不需要重新設置框架。超級視圖(此處爲單元格)滾動屏幕時,幀保持不變。 – 2013-04-29 07:22:32

相關問題