2016-09-05 10 views
0

내 ViewController의 아래쪽 툴바와 그 위에있는 TableView가 있습니다. 도구 모음에는 중간에 날짜 레이블이 있고 왼쪽과 오른쪽에 다음 및 이전 단추가 있습니다. 선택한 날짜에 따라 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 루프를 사용하여 제스처 배열을 제거해야합니다.

관련 문제