2016-03-24 5 views
0

スクリーンショットでわかるように、UIスクロールビューで複数のボタンを動的に作成しました。すべてのボタンは実際に日付アクションを保持し、その日付の特定のイベントがテーブルにロードされます。 UIスクロールビューは、コード内のグローバル要素であり、コントローラ内のどのメソッドからもアクセスできます。objective c uiscrollviewで動的に作成されたボタンの背景色にアクセスして変更する方法

今私が望んでいたのは、そのスクロールビューで(その日のイベントを見るために日付を選んだ)ボタンにアクセスし、その背景色を変更することでした。あなたの便宜のために、日付とスクロールビューのコード全体を追加しました。また、リモートサーバーからデータがロードされていることにも注意してください。 enter image description here

を次のようにスクリーンショットを

リンクを使用すると、タイピング中に何も悪いことを見れば、私を許してくださいです。これは私の最初の質問です。

 luckyDateScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(22, 2, lucky_screen_width-45, 23)]; 
    luckyDateScrollView.showsHorizontalScrollIndicator = NO; 

    CGFloat paperWidth = 50; 
    int numberOfPapers = [dateRanges count]; 

    for (int i=0; i<[dateRanges count]; i++) { 
       //NSLog(@"%d: %@", i, dateRange[i]); 

       //php like exploding with separator | 
       NSArray *dateString = [dateRanges[i] componentsSeparatedByString:@"|"]; 


       UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(5+ (paperWidth+4) * i , 0, paperWidth, luckyDateScrollView.bounds.size.height)]; 
       btn.titleLabel.font = [UIFont fontWithName:@"Arial" size:11.0f]; 
       [btn setTitle: [NSString stringWithFormat:@"%@",dateString[0]] forState:UIControlStateNormal]; 

       //dateResendButton 
       [btn setTag:i]; 
       [btn addTarget:self 
         action:@selector(byDateFilterButton:) 
      forControlEvents:UIControlEventTouchUpInside]; 

      if([today isEqualToString:dateString[1]]){ 
       [GlobalMethods makeRoundedView:btn WithColorString:@"#ffffff" BGColorString:@"#004D00"]; 
      }else{ 
       [GlobalMethods makeRoundedView:btn WithColorString:@"#ffffff" BGColorString:GlobalVariables.initGV.BlackColor]; 
      } 


       //[GlobalMethods makeRoundedView:btn WithColorString:@"#ffffff" BGColorString:@"#FF0000"]; 
       [luckyDateScrollView addSubview:btn]; 
    } 



    contentSize = CGSizeMake(10 + (paperWidth+4) * numberOfPapers, luckyDateScrollView.bounds.size.height); 
    luckyDateScrollView.contentSize = contentSize; 

    //   [GlobalMethods makeRoundedView:aScrollView WithColorString:@"#ffffff" BGColorString:GlobalVariables.initGV.BlackColor]; 

    [dateUIView addSubview:luckyDateScrollView]; 

    luckyDateBtnLeftScroll = [[UIButton alloc] initWithFrame:CGRectMake(5, 2, 20, 23)]; 
    [luckyDateBtnLeftScroll setBackgroundImage:[UIImage imageNamed:@"arrow_g_icon_left"] forState:UIControlStateNormal]; 
    [luckyDateBtnLeftScroll addTarget:self action:@selector(dateSetScrollToLeft:) forControlEvents:UIControlEventTouchUpInside]; 

    [dateUIView addSubview:luckyDateBtnLeftScroll]; 

    luckyDateBtnRightScroll = [[UIButton alloc] initWithFrame:CGRectMake(lucky_screen_width-25, 2, 20, 23)]; 
    [luckyDateBtnRightScroll setBackgroundImage:[UIImage imageNamed:@"arrow_g_icon"] forState:UIControlStateNormal]; 
    [luckyDateBtnRightScroll addTarget:self action:@selector(dateSetScrollToRight:) forControlEvents:UIControlEventTouchUpInside]; 

    [dateUIView addSubview:luckyDateBtnRightScroll]; 

    //ViewCollapse.backgroundColor = [UIColor colorWithCGColor: @"#FFD80D"]; 
+0

ようこそstackoverflowへようこそ。任意の画像ホスティングウェブサイト(imgur.comなど)に画像をアップロードし、ここにリンクを投稿することができます。 – atulkhatri

+0

ありがとうatulkhatri。私はここにスクリーンショットを追加しました... http://imgur.com/8ptWTRA – tushersuvro

+0

申し訳ありません、これは直接リンクですhttp://i.imgur.com/8ptWTRA.png?1 – tushersuvro

答えて

0

質問が正しく分かった場合は、byDateFilterButton:メソッドでボタンの背景を変更するだけで済みます。問題のボタンになるパラメータはsenderである必要があります。 他のボタンの背景も通常の状態に戻す必要がある場合は、それらを参照する必要があります。おそらく配列(または辞書があります。

+0

はい。あなたは正しいパジェヴィックです。私はこのようにコードを変更しました。ありがとう – tushersuvro

+0

私は喜んで私が助けることができる。その答えがあなたの問題を解決するのに役立つなら、それを受け入れることでこれをマークしてください。 – pajevic

0

私は以下の方法でDateFilterButtonメソッドを変更しました。このSOのおかげで、Access all buttons in uiscollview

for (id obj in luckyDateScrollView.subviews) { 

    NSString *classStr = NSStringFromClass([obj class]); 

    if ([classStr isEqualToString:@"UIButton"]) { 
     UIButton *button = (UIButton*)obj; //NSLog(@"buttonn tag %ld",(long)button.tag); 

     if(sender.tag == button.tag){ // currently selected button 
      [GlobalMethods makeRoundedView:button WithColorString:@"#ffffff" BGColorString:@"#555454"]; 
     } 
     else{ // the rest of buttons 
      [GlobalMethods makeRoundedView:button WithColorString:@"#ffffff" BGColorString:GlobalVariables.initGV.BlackColor]; 
     } 
    } 

} 
+0

はい、これは動作します。私はあなたがそれをすることを選んだ方法が好みの問題だと思います。個人的には、配列のボタンへの参照を保持してから、スクロールビューのすべてのサブビューを繰り返すのがよりクリーンです。クラスチェックのオーバーヘッドがなく、他のサブビューをループすることはありません(特に、それら)。私はいくつかの指針を持っています。第1に、クラスをチェックするより良い方法は、サブクラスも含めたい場合は '[obj isMemberOfClass:UIButton.class]'または '[obj isKindOfClass:UIButton.class]'メソッドを使うだけです。 – pajevic

+0

第2に、オブジェクトをテストするためのタグは必要ありません。単純に 'sender == button'を使うと、この比較がオブジェクト参照を使用するので、2つのオブジェクトが1つの同じオブジェクトであるかどうかを教えてくれます。これはオブジェクトの場合にのみ当てはまります。 ( 'int'や' float'のような)プリミティブに '=='を使っても、値をチェックします。 – pajevic

+0

もう一度pajevicありがとうございます。うん、私はあなたの提案でコードを修正しました。それでも同じです。このクリーンな提案をありがとう。 :-) – tushersuvro

関連する問題