2016-09-05 7 views
0

私はViewControllerの下のツールバーとその上にあるTableViewを持っています。ツールバーの中央には日付ラベル、左右には次と前のボタンがあります。選択した日付のテーブルビューの内容に基づいて変更します。UITableViewCellのラベルからジェスチャ認識子を削除するにはどうすればよいですか?

今、TableViewCellにはUILabelが含まれています。選択した日が今日の場合にのみ、ラベルにジェスチャーを追加したいと思います。

は、だから、私は、セル更新方法

UITapGestureRecognizer gesture = new UITapGestureRecognizer(); 
gesture.AddTarget(() => HandleValueLabelClick()); 
if (source.parentController.selectedDateTime.Day == DateTime.Now.Day) 
{ 
    AddEditAction(); 
    ValueLabel.AddGestureRecognizer(gesture); 
} 
else 
{ 
    ValueLabel.RemoveGestureRecognizer(gesture); 
} 

に書いた。しかしジェスチャーは、選択した日付が今日でない場合、機能していません削除します。それはあなたが新たに作成されたジェスチャーではなく、それが既に持っているかもしれジェスチャーを削除する原因となる」動作しません

public partial class ProgramCalendarCell : UITableViewCell 
{ 
    NSIndexPath indexPath; 

    ProgramVitalsCalendarTableSource source; 
    ProgramVital vital; 
    ProgramVitalCalendar calendar; 

    public ProgramCalendarCell (IntPtr handle) : base (handle) 
    { 
    } 

    public void UpdateCell(ProgramVital vital, ProgramVitalCalendar calendar, NSIndexPath indexPath, ProgramVitalsCalendarTableSource source) 
    { 
     this.source = source; 
     this.indexPath = indexPath; 
     this.vital = vital; 
     this.calendar = calendar; 

     InitVitalName(); 
     InitVitalValue(); 

     NewValueTextField.Hidden = true; 
     ValueLabel.Hidden = false; 

     UIView separatorLine = new UIView(new CoreGraphics.CGRect(0, 44, 1200f, 0.5f)); 
     separatorLine.BackgroundColor = AZConstants.SeparatorColor; 
     ContentView.AddSubview(separatorLine); 

     UITapGestureRecognizer gesture = new UITapGestureRecognizer(); 
     gesture.AddTarget(() => HandleValueLabelClick()); 
     if (source.parentController.selectedDateTime.Day == DateTime.Now.Day) 
     { 
      AddEditAction(); 
      ValueLabel.AddGestureRecognizer(gesture); 
     } 
     else 
     { 
      ValueLabel.RemoveGestureRecognizer(gesture); 
     } 
    } 

    void InitVitalName() 
    { 
     string name = vital.vitalName; 
     if (!String.IsNullOrEmpty(vital.unitName)) 
      name += " (" + System.Net.WebUtility.HtmlDecode(vital.unitName) + ")"; 
     VitalNameLabel.Text = name; 
    } 

    void InitVitalValue() 
    { 
     string value = ""; 
     string color = ""; 
     if (calendar != null) 
     { 
      value = calendar.values[0].value; 
      color = calendar.values[0].color; 
     } 
     UIHelper.SetVitalValueTileBackGround(ValueLabel, value, color); 
    } 

    void HandleValueLabelClick() 
    { 
     ValueLabel.Hidden = true; 
     NewValueTextField.Hidden = false; 
     NewValueTextField.BecomeFirstResponder(); 
    } 

    void AddEditAction() 
    { 
     ValueLabel.UserInteractionEnabled = true; 
     NewValueTextField.ShouldReturn = (textField) => 
     { 
      textField.ResignFirstResponder(); 
      ValueLabel.Hidden = false; 
      NewValueTextField.Hidden = true; 
      Console.WriteLine("Row: " + indexPath.Row); 
      return true; 
     }; 

     UIToolbar toolbar = new UIToolbar(new RectangleF(0.0f, 0.0f, (float)UIScreen.MainScreen.Bounds.Size.Width, 44.0f)); 
     toolbar.BarTintColor = AZConstants.PrimaryColor; 
     toolbar.TintColor = UIColor.White; 
     toolbar.Items = new UIBarButtonItem[]{ 
      new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), 
       new UIBarButtonItem(UIBarButtonSystemItem.Done, delegate { 
        Console.WriteLine("Row: " + indexPath.Row); 
        SaveReading(); 
        NewValueTextField.ResignFirstResponder(); 
       }) 
      }; 
     toolbar.BarTintColor = AZConstants.PrimaryColor; 
     toolbar.TintColor = UIColor.White; 
     toolbar.Translucent = true; 
     toolbar.SizeToFit(); 
     NewValueTextField.InputAccessoryView = toolbar; 

     int vId = Int32.Parse(vital.vitalId); 

     if (vId == 20 || vId == 5 || vId == 496) 
      NewValueTextField.KeyboardType = UIKeyboardType.DecimalPad; 
     else 
      NewValueTextField.KeyboardType = UIKeyboardType.NumberPad; 
    } 

    async void SaveReading() 
    { 

     var hud = UIHelper.GetProgressHud(source.parentController.View, ""); 
     hud.Show(animated: true); 
     Status status = await VitalHelper.postVitalValue(Constants.__IOS__, vital, NewValueTextField.Text, 0, 
                 DateTime.Now.ToString("MM/dd/yyyy"), DateTime.Now.ToString("hh:mm tt"), ""); 

     if (status.status) 
     { 
      source.parentController.FetchAndDisplayVitalValues(); 
     } 
     else 
     { 
      new UIAlertView("Error", status.message, null, "OK", null).Show(); 
     } 
     hud.Hide(animated: true, delay: 0); 
    } 
} 
+0

今日はそうでなければ、単に行動しないでください。それ以外の場合は、タップジェスチャーをいつ追加しますか?どこにあるかによって、 'HandleValueLabelClick()'が複数回呼び出される場合があります(セルが再利用されるため) – Larme

+0

最初にelse部分を持っていません。それでも同じ効果があった。 – HeisenBerg

+0

@Larme私は完全なコードを投稿しました。参照してください。 – HeisenBerg

答えて

1

:すべてのヘルプは..

編集を高く評価しています。 ジェスチャ配列をValueLabel.gestureRecognizersで取得し、forループを使用してジェスチャ配列を削除する必要があります。

関連する問題