2017-05-28 4 views
10

नहीं दिख रहे हैं मुझे टास्क कॉम्प्लेशन स्रोत ऑब्जेक्ट और अलर्ट के डिसमिस फ़ंक्शन से संबंधित समस्या मिली है। यह समस्या आवेदनकार्य पूर्णीकरण स्रोत और खारिज करने का कारण बनता है कि एकाधिक कस्टम अलर्टडिअलॉग

आवेदन एक अधिसूचना भेजता है, तो कार्यक्षमता काम करना के साथ दो अलर्ट की आईओएस संस्करण के भीतर प्रकट नहीं होता दिखाई देगा जब उपयोगकर्ता अनुप्रयोग को सक्रिय करता है:

  1. प्रमाणीकरण में
  2. भरने एक कीमत।

हालांकि, जब मैं एप्लिकेशन में प्रवेश करता हूं तो मुझे केवल प्रमाणीकरण दिखाई देता है (क्योंकि इस चेतावनी को पहले ऐप के अंदर बुलाया जाता है) और दूसरी चेतावनी कभी दिखाई नहीं देती है। मैंने पहले से ही डिसमिस फ़ंक्शन को ओवरराइड करने का प्रयास किया है और टास्क कॉम्प्लेशनसोर्स ऑब्जेक्ट परिणाम को शून्य पर सेट किया है, लेकिन यह एप्लिकेशन क्रैश होने से पहले X बार दिखाई देने के लिए एक ही चेतावनी का कारण बनता है। क्या TaskCompletionSource ऑब्जेक्ट को दोहराने का कोई तरीका है ताकि मैं सभी अलर्ट देख सकूं? या डिसमिस फ़ंक्शन पर मुझे किस तरह के संशोधनों की आवश्यकता है ताकि सभी अलर्ट दिखाए जाने के बाद टास्ककंपलेशन स्रोत पूरा हो जाए?

एंड्रॉयड टुकड़ा उदाहरण कोड:

public static readonly int AlertWidth = Device.Idiom == TargetIdiom.Phone ? 270 : 320; 

    class AlertDialogFragment : DialogFragment 
    { 
     public string Title; 
     public string Body; 
     public View Content; 
     public List<AlertButton> Buttons; 
     public TaskCompletionSource<object> tsc; 


     public Dialog AndroidCustomAlert(Activity activ) 
     { 
      Android.Views.LayoutInflater inflater = Android.Views.LayoutInflater.From(activ); 
      Android.Views.View view = inflater.Inflate(Resource.Layout.AlertDialogLayout, null); 

      AlertDialog.Builder builder = new AlertDialog.Builder(activ); 
      builder.SetView(view); 
      Android.Widget.TextView title = view.FindViewById<Android.Widget.TextView>(Resource.Id.Login); 
      title.Text = Title; 

      Android.Widget.TextView body = view.FindViewById<Android.Widget.TextView>(Resource.Id.pincodeText); 
      body.Text = Body; 
      body.MovementMethod = new Android.Text.Method.ScrollingMovementMethod(); 

      Android.Widget.EditText pincode = view.FindViewById<Android.Widget.EditText>(Resource.Id.pincodeEditText); 
      Android.Widget.Button btnPositive = view.FindViewById<Android.Widget.Button>(Resource.Id.btnLoginLL); 
      Android.Widget.Button btnNegative = view.FindViewById<Android.Widget.Button>(Resource.Id.btnClearLL); 
      Android.Widget.Button btnNeutral = view.FindViewById<Android.Widget.Button>(Resource.Id.btnNeutral); 

      if (Title.Contains("Time")) 
      { 
       Android.Views.View secondView = inflater.Inflate(Resource.Layout.TimePickerLayout, null); 
       builder.SetView(secondView); 

       btnPositive = secondView.FindViewById<Android.Widget.Button>(Resource.Id.btnLoginLL); 
       btnNegative = secondView.FindViewById<Android.Widget.Button>(Resource.Id.btnClearLL); 
       var tp = secondView.FindViewById<Android.Widget.TimePicker>(Resource.Id.timePicker1); 
       tp.SetIs24HourView((Java.Lang.Boolean)true); 
       //Positive button feedback 
       btnPositive.Text = Buttons.Last().Text; 
       btnPositive.Click += delegate 
       { 
        var car = (Xamarin.Forms.TimePicker)Content; 
        var ts = new TimeSpan(tp.Hour, tp.Minute, 0); 
        car.Time = ts; 

        CommandsForButtons(Buttons.Last()); 
       }; 

       //Negative button feedback 
       btnNegative.Text = Buttons.First().Text; 
       btnNegative.Click += delegate 
       { 

        CommandsForButtons(Buttons.First()); 
       }; 
      } 
      else if (Title.Contains("How are you")) 
      { 
       btnPositive.Visibility = Android.Views.ViewStates.Gone; 
       btnNegative.Visibility = Android.Views.ViewStates.Gone; 
       btnNeutral.Visibility = Android.Views.ViewStates.Visible; 
       pincode.Visibility = Android.Views.ViewStates.Gone; 

       var happySlider = view.FindViewById<Android.Widget.SeekBar>(Resource.Id.happinessSlider); 
       happySlider.SetProgress(5, false); 
       happySlider.Visibility = Android.Views.ViewStates.Visible; 
       btnNeutral.Text = Buttons.First().Text; 
       btnNeutral.Click += delegate 
       { 
        var car = (StackLayout)Content; 

        var layoutView = (Xamarin.Forms.AbsoluteLayout)car.Children[1]; 
        var slider = (Slider)layoutView.Children[1]; 

        var totalHappyValue = happySlider.Progress/10; 
        slider.Value = totalHappyValue; 

        CommandsForButtons(Buttons.First()); 
       }; 
      } 
      else 
      { 

       //Checks if there are no buttons, and if there aren't any, creates a neutral one 
       if (Buttons == null || Buttons.Count == 0) 
       { 
        btnPositive.Visibility = Android.Views.ViewStates.Gone; 
        btnNegative.Visibility = Android.Views.ViewStates.Gone; 
        btnNeutral.Visibility = Android.Views.ViewStates.Visible; 
        pincode.Visibility = Android.Views.ViewStates.Gone; 

        Buttons = new List<AlertButton> { 
       new AlertButton { 
        Text = "Oké", 
        IsPreferred = true, 
        Action =() => false 
        } 
       }; 
        btnNeutral.Text = Buttons.First().Text; 
        btnNeutral.Click += delegate 
        { 

         CommandsForButtons(Buttons.First()); 
        }; 
       } 

       if (Content == null) 
       { 
        pincode.Visibility = Android.Views.ViewStates.Gone; 
       } 

       //Positive button feedback 
       btnPositive.Text = Buttons.Last().Text; 
       btnPositive.Click += delegate 
       { 
        var test = (StackLayout)Content; 

        if (test != null) 
        { 
         var car = (Entry)test.Children[0]; 
         car.Text = pincode.Text; 
        } 

        CommandsForButtons(Buttons.Last()); 
       }; 

       //Negative button feedback 
       btnNegative.Text = Buttons.First().Text; 
       btnNegative.Click += delegate 
       { 

        CommandsForButtons(Buttons.First()); 
       }; 
      } 
      return builder.Create(); 
     } 

     public void CommandsForButtons(AlertButton button) 
     { 
      Func<Task> dismiss = null; 
      var command = new Command(async() => 
      { 
       var ab = button; 
       var cont = true; 
       if (ab.Action != null) 
        cont = ab.Action(); 
       if (ab.ActionAsync != null) 
       { 
        cont = cont && await ab.ActionAsync(); 
       } 
       if (!cont) 
       { 
        await dismiss(); 
       } 
      }); 

      dismiss = async() => 
      { 
       dismiss = async() => { }; 
       await Task.Run(() => 
       { 
        Dismiss(); 
        tsc.SetResult(null); 
       }); 

       Log.Debug("TSC", tsc.Task.Status.ToString()); 

      }; 

      command.Execute(this); 
     } 

     public override Dialog OnCreateDialog(Bundle savedInstanceState) 
     { 
      var test = AndroidCustomAlert(Activity); 
      test.SetCanceledOnTouchOutside(false); 
      return test; 
     } 

     public override void Dismiss() 
     { 
      base.Dismiss(); 

     } 
    } 

    public async Task Show(string title, string body, View content, List<AlertButton> buttons) 
    { 

     var tcs = new TaskCompletionSource<object>(); 

     var adf = new AlertDialogFragment 
     { 
      Title = title, 
      Body = body, 
      Content = content, 
      Buttons = buttons, 
      tsc = tcs 
     }; 
     var FragmentManager = ((Activity)Forms.Context).FragmentManager; 
     FragmentTransaction ft = FragmentManager.BeginTransaction(); 

     //Remove fragment else it will crash as it is already added to backstack 
     Fragment prev = FragmentManager.FindFragmentByTag("alert"); 
     if (prev != null) 
     { 
      ft.Remove(prev); 
     } 

     ft.AddToBackStack(null); 
     adf.Show(ft, "alert"); 
     await tcs.Task; 
    } 

तरीके:

await Authentication(); 
await UserCheck(); 

और आईओएस कोड:

public static readonly int AlertWidth = Device.Idiom == TargetIdiom.Phone ? 270 : 320; 

    public async Task Show(string title, string body, View content, List<AlertButton> buttons) 
    { 
     if (buttons == null || buttons.Count == 0) 
     { 
      buttons = new List<AlertButton> { 
       new AlertButton { 
        Text = "Oké", 
        IsPreferred = true, 
        Action =() => false 
       } 
      }; 
     } 

     Func<Task> dismiss = null; 

     var captionSize = (double)StyleKit.PhoneDarkLabelStyles.Caption.Setters.First(s => s.Property == Label.FontSizeProperty).Value; 
     var titleSize = (double)StyleKit.PhoneDarkLabelStyles.Title.Setters.First(s => s.Property == Label.FontSizeProperty).Value; 

     var top = new StackLayout { 
      Padding = new Thickness(15, 20, 15, 20), 
      Spacing = 3, 
      Children = { 
       new Label { 
        Text = title, 
        Style = StyleKit.PhoneDarkLabelStyles.Title, 
        FontSize = Math.Max(16, titleSize), 
        HorizontalTextAlignment = TextAlignment.Center 
       }, 
       new Label { 
        Text = body, 
        Style = StyleKit.PhoneDarkLabelStyles.Body, 
        //FontSize = , 
        FontSize = Math.Max(14, captionSize), 
        HorizontalTextAlignment = TextAlignment.Center 
       } , 
       new ContentView { 
        Padding = new Thickness(0,5,0,-10), 
        VerticalOptions = LayoutOptions.EndAndExpand, 
        Content = content 
       } 
      } 
     }; 

     var buttonViews = buttons.Select(ab => new Button { 
      FontSize = Math.Max(16, titleSize), 
      Text = ab.Text, 
      FontAttributes = ab.IsPreferred ? FontAttributes.Bold : FontAttributes.None, 
      TextColor = ab.IsDestructive ? Color.Red : Color.Default, 
      Command = new Command(async() => { 
       var cont = true; 
       if (ab.Action != null) 
        cont = ab.Action(); 
       if (ab.ActionAsync != null) 
        cont = cont && await ab.ActionAsync(); 
       if (!cont) 
        await dismiss(); 
      }) 
     }).ToList(); 

     var grid = new Grid { 
      RowDefinitions = { 
       new RowDefinition { Height = GridLength.Auto }, 
       new RowDefinition { Height = GridLength.Auto } 
      }, 
      ColumnSpacing = 0, 
      RowSpacing = 0 
     }; 
     buttons.ForEach(button => { 
      grid.ColumnDefinitions.Add(
       new ColumnDefinition { 
        Width = AlertWidth/buttonViews.Count 
       } 
      ); 
     }); 

     for (int i = 0; i < buttonViews.Count; i++) 
     { 
      grid.Children.Add(new BorderView { 
       BorderColor = Color.FromRgba(0,0,0,0.2), 
       Thickness = new Thickness(0, 1, (i + 1 < buttonViews.Count) ? 1 : 0, 0) 
      }, i, 1); 
      grid.Children.Add(buttonViews[i], i, 1); 
     } 
     grid.Children.Add(top, 0, buttons.Count, 0, 1); 

     var box = new Frame { 
      WidthRequest = AlertWidth, 
      BackgroundColor = Color.FromRgba(1,1,1,0.96), 
      Padding = 0, 
      Content = grid 
     }; 
     var outer = new AbsoluteLayout { 
      BackgroundColor = Color.FromRgba(0,0,0,0.65), 
      Opacity = 0, 
      Children = { box } 
     }; 
     AbsoluteLayout.SetLayoutFlags(box, AbsoluteLayoutFlags.PositionProportional); 
     AbsoluteLayout.SetLayoutBounds(box, 
      new Rectangle(0.5, 0.5, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize)); 

     var page = new ContentPage { 
      Content = /* new ScrollView { Content = */ outer // } 
     }; 

     var tcs = new TaskCompletionSource<object>(); 

     var topVC = UIApplication.SharedApplication.KeyWindow.RootViewController; 
     while (topVC.PresentedViewController != null) { 
      topVC = topVC.PresentedViewController; 
     } 

     var vc = page.CreateViewController(); 
     topVC.Add(vc.View); 
     var innerView = vc.View.Subviews[0].Subviews[0]; 
     vc.View.RemoveFromSuperview(); 

     dismiss = async() => { 
      dismiss = async() => {}; 
      await outer.FadeTo(0, 50); 
      innerView.RemoveFromSuperview(); 
      tcs.SetResult(null); 
     }; 

     topVC.Add(innerView); 

     var kbh = new KeyboardHelper(); 
     kbh.KeyboardChanged += async (sender, e) => { 
      await box.TranslateTo(0, e.Visible ? (-e.Height/2f) : 0, 100, Easing.CubicInOut); 
     }; 

     await outer.FadeTo(1, 100); 

     await tcs.Task; 
    } 

उत्तर

1

यह एक और/या सूत्रण या बस के बीच समस्या की तरह दिखता है कार्य पूरा करने की स्थापना नहीं।

आईओएस संस्करण में आप

 dismiss = async() => { 
     dismiss = async() => {}; 
     await outer.FadeTo(0, 50); 
     innerView.RemoveFromSuperview(); 
     tcs.SetResult(null); 
    }; 

है एंड्रॉयड संस्करण में कोई मिलान tcs.SetResult(null); बयान नहीं है।

नोट्स भी शामिल है async invocation, SetResult को कॉल करने की प्रतीक्षा के बिना मुख्य धागे को अवरुद्ध कर देगा।

+0

इसलिए, मैंने आपके सुझावों के साथ अपनी पोस्ट अपडेट की है। अच्छी खबर यह है कि नोटिफिकेशन के बाद अलर्ट दिखाई दे रहे हैं! हालांकि, अलर्ट दो बार दिखाई देते हैं (उदाहरण के लिए, पहला प्रमाणीकरण, फिर स्लाइडर और दोहराना)। क्या आप इसे हल करने का एक तरीका जानते हैं। आपकी मदद के लिए अब तक धन्यवाद! –

+0

क्या आप वर्तमान कोड साझा कर सकते हैं? – CCondron

+0

मैंने पहले से ही अपने प्रश्न को वर्तमान कोड के साथ संपादित किया है, क्या इसका मतलब है? –

संबंधित मुद्दे