2016-06-22 25 views
1

UIPickerViewを表示すると、選択した行が一意のテキストカラーで表示されます。したがって、選択された行は赤色のフォントで表示され、他のすべての(選択されていない)行は黒色/デフォルトのフォントで表示されます。UIPickerViewの開始行のテキストの色を変更する方法

私はこれを実装している:

完璧選択を変更するときに動作しますが、表示される最初の行のために何もしません
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    UILabel *label = (UILabel*)[pickerView viewForRow:row forComponent:component]; 
    label.textColor = [UIColor redColor]; 

    UILabel *oldLabel = (UILabel*)[pickerView viewForRow:self.previouslySelectedRow forComponent:component]; 
    oldLabel.textColor = [UIColor blackColor]; 

    self.previouslySelectedRow = row; 
} 

。私はUIPickerViewを表示

[pickerView selectRow:initialRow inComponent:0 animated:NO]; 

した後、私はこれは(ユーザーが手動で選択を変更したときにのみ問題が発生していること)と呼ばれてdidSelectRowが生じないことを認識している:

私は呼び出しています。

私はUILabeltextColor値を自分で設定しようとした - 何かのように:

UILabel *label = (UILabel*)[pickerView viewForRow:startingRow forComponent:0]; 
    label.textColor = [UIColor redColor]; 

しかし残念ながら何の結果が起こっていること。私はpickerviewを表示した後、これをAFTERと呼んでいます。

これを行う簡単な方法はありますか?何か不足していますか?すべてのヘルプありがとう!

ザック

答えて

0

私は自分自身がちょうど最近、Xamarin MonoTouchで(iOS用の.NET)で働いて、この問題を持っていた私は、「クリーン」な修正を見つけるcouldntのが、私は、これまで正常に動作するように非常に小さなハックを作りました。私はObjCを読むことができるように私はC#で私の解決策を提供しますが、私はそれを書くことによって自分自身を恥ずかしがります。あなたは考えをかなり簡単に私は望む必要があります。

  • オーバーライドUIPickerViewDelegate。 intフィールドを追加します。このフィールドでは、ピッカーが初めて使用するときに選択する必要があるデータ項目のインデックスを設定します。

    protected class PickerDelegate : UIPickerViewDelegate 
    { 
        // Contruction...overrides etc 
    
        public int SelectIndexOnLoad { get; set; } 
    } 
    
  • は今、あなたはpickercontrolをインスタンス化/ロードするコード(のviewDidLoadなど)を表示したいデータが含まれているデータソースのインデックスを見つけるの領域に/ピッカーで最初に選択します。 pickerdelegates viewForRow()呼び出し(XamarinにObjCコールがgetViewメソッドにマッピングされる())我々は、渡された行変数にPickerDelegate.SelectIndexOnLoadを比較し、UIは

    public override UIView viewForRow(UIPickerView pickerView, int row, int component, UIView view) 
        { 
         // Forget reusing the passed view 
         // there is a bug in ios 7,8,9 which ensures its ALWAYS null, nice Apple! 
         var view1 = new UILabel(predefined_rect_size); 
         if (this.SelectIndexOnLoad == row) 
         { 
          view1.BackgroundColor = UIColor.Pink; 
         } 
         else 
         { 
          view1.BackgroundColor = UIColor.White; 
         } 
    
        // Optionally reset the SelectIndexOnLoad so that as the user moves 
        // the picker (viewForRow is called constantly for redraws) 
        // it goes back to normal color once moved. 
        // If you want to keep it colored so the user knows the old original value 
         // Simply omit this line 
         this.SelectIndexOnLoad = row; 
    
         return view1; 
    
        } 
    
値を決定しにおいて

// First get the index value of the current set of data you 
    // want to display, assuming here I have a list of items as my 
    // picker datasource 

    var x = this.items.IndexOf(data_value_to_display); 

    // Then assign it to our PickerDelegate.SelectIndexOnLoad 

    this.myPickerDelegate.SelectIndexOnLoad = x; 
    this.myPickerView.selectRow(x, 0, true); 

    // Note in Xamarin, the objc delegate call selectRow() is mapped to Select() 
  • これはうまくいきますが、私はそれが好きではありません。私はObjCの達人が私たちを啓発することを期待していますが、それまではこのハックがトリックです。 親切よろしく

  • 0

    3「pickerView.selectRowが」と呼ばれる?

    1.をチェックするものすべて返すため(のInt ... _ pickerView:UIPickerView、viewForRow行)

    それは pickerViewためのいくつかの時間を与えるためにviewDidLayoutSubviews(好む)またはviewDidappear に置く代わりのviewDidLoadまたはviewWillAppear に呼び出すべきではありませんUIViewの

    (iphone6ため、後で、あなたは、 追加 'self.yourPIckerView.layoutIfNeeded()' 行を選択する前viewDidLayoutSubviewsに入れた場合)

    2. didSelectRowを手動で呼び出さなければなりません

    'pickerView.selectRow'はdidSelectRowを自動的に起動しません。 行の後に、これを配置して手動でトリガーします。 self.pickerView(self.yourPickerView、didSelectRow:行、inComponent:COMP)

    3.パラメータが '偽' でなければならないアニメーション

    'pickerView.selectRow(行、inComponent:COMP、アニメーション:偽)'

    それが「本当」なら、それは遅延によって無視することができピッカーが最終的に手動で と色の変化を選択された行を取得するにはある程度の時間がかかります

    関連する問題