Ich mache heute Widget-Erweiterung, wo ich Symbole von Münzen und dann mache ich Web-Anfrage Objekte zu bekommen.Xamarin-iOS heute Widget, kann nicht geladen werden Problem
Bei jedem Neuladen zeichnet das Widget die Ansicht erneut und ruft die WidgetPerformUpdate-Methode auf, die von 1/10 widget show mir nicht geladen werden kann.
Ich debugged App und Problem kommt auf mich, wenn ich einige Objekte in Widget hinzufügen.
Ich habe in diesem Problem etwa 1 Woche gestapelt, ich habe alle heute Widget-Dokumentation gelesen, Tutorials gibt es keine Hilfe von nirgendwo.
Ich weiß nicht, was zu tun ist, unfähig zu laden ist mein Albtraum.
Es ist mein Code TodawyWidgetViewController.
using System;
using System.Collections.Generic;
using NotificationCenter;
using Foundation;
using UIKit;
using CryptoCurrencyPCL.POCO;
using CryptoCurrencyPCL.Middleware;
using System.Linq;
using System.Threading.Tasks;
using CryptoCurrencyPCL.Extensions;
using CryptoCurrencyPCL.Enums;
using CoreGraphics;
using Newtonsoft;
using Newtonsoft.Json;
using CryptoPCL.POCO;
namespace CryptoTodayWidget
{
public partial class TodayViewController : UIViewController, INCWidgetProviding,IUITableViewDataSource,IUITableViewDelegate
{
NSUserDefaults userDefaults;
const string ReuseId = "currencyCellReuseId";
List<CoinDetail> _coins;
List<CoinDetail> _cachedCoins;
List<FavoriteCoin> _favorites;
List<string> listOfStrings = new List<string>();
Currency itemCurrency;
private CGSize _maxSize;
private string nsStringForValues;
private string nsString;
private List<string> deserializedObjectsSymbols;
bool _firstInit = true;
protected TodayViewController(IntPtr handle) : base(handle)
{
// Note: this .ctor should not contain any initialization logic.
}
public override void DidReceiveMemoryWarning()
{
// Releases the view if it doesn't have a superview.
base.DidReceiveMemoryWarning();
// Release any cached data, images, etc that aren't in use.
}
public UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
var cell = tableView.DequeueReusableCell(ReuseId, indexPath) as WidgetCell;
var item = _coins[indexPath.Row];
var favorite = _favorites[indexPath.Row];
cell.InitData(item,favorite,itemCurrency);
return cell;
}
public nint RowsInSection(UITableView tableView, nint section)
{
return _coins?.Count ?? 0;
}
[Export("tableView:heightForRowAtIndexPath:")]
public nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
return 50;
}
[Export("numberOfSectionsInTableView:")]
public nint NumberOfSections(UITableView tableView)
{
return 1;
}
public async override void ViewDidLoad()
{
base.ViewDidLoad();
var webClient = CryptoCurrencyPCL.Services.CryptoWebClient.Instance;
tableView.SeparatorStyle = UITableViewCellSeparatorStyle.None;
_cachedCoins = _coins;
if(_coins != null) {
initTableView();
}
ExtensionContext.SetWidgetLargestAvailableDisplayMode(NCWidgetDisplayMode.Expanded);
}
private void initTableView()
{
tableView.DataSource = this;
tableView.Delegate = this;
tableView.AllowsSelection = false;
tableView.ReloadData();
}
public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
}
[Export("widgetPerformUpdateWithCompletionHandler:")]
public async void WidgetPerformUpdate(Action<NCUpdateResult> completionHandler)
{
var webClient = CryptoCurrencyPCL.Services.CryptoWebClient.Instance;
try
{
initLoading();
bool check = false;
userDefaults = new NSUserDefaults("group.com.mpdc.todayextension", NSUserDefaultsType.SuiteName);
nsStringForValues = userDefaults?.StringForKey(new NSString("MyAppsValues"));
nsString = userDefaults?.StringForKey("currencyKey");
itemCurrency = (Currency)Enum.Parse(typeof(Currency), nsString);
_favorites = JsonConvert.DeserializeObject<List<FavoriteCoin>>(nsStringForValues);
deserializedObjectsSymbols = _favorites.Select(o => o.FavoriteCoinSymbol).ToList();
_coins = await webClient.GetMultiCoinDetailsAsync(deserializedObjectsSymbols, itemCurrency);
if (ExtensionContext.GetWidgetLargestAvailableDisplayMode() == NCWidgetDisplayMode.Compact)
{
this.PreferredContentSize =_maxSize;
}
else
{
this.PreferredContentSize = new CoreGraphics.CGSize(0, _coins.Count * 50);
}
initTableView();
initLoading(false);
tableView.SeparatorStyle = UITableViewCellSeparatorStyle.SingleLine;
completionHandler(NCUpdateResult.NewData);
}
catch (Exception ex)
{
initLoading(false);
completionHandler(NCUpdateResult.Failed);
Console.WriteLine(ex);
}
}
void initLoading(bool visible = true)
{
if (visible)
{
ActivityIndicator.Hidden = false;
ActivityIndicator.StartAnimating();
return;
}
ActivityIndicator.Hidden = true;
ActivityIndicator.StopAnimating();
}
[Export("widgetActiveDisplayModeDidChange:withMaximumSize:")]
public void WidgetActiveDisplayModeDidChange(NCWidgetDisplayMode activeDisplayMode, CoreGraphics.CGSize maxSize)
{
_maxSize = maxSize;
if (activeDisplayMode == NCWidgetDisplayMode.Compact)
{
this.PreferredContentSize = _maxSize;
}
else
{
if(_coins!=null)
this.PreferredContentSize = new CoreGraphics.CGSize(0, _coins.Count * 50);
}
}
}
}
Danke
Sie können den Absturzcode posten, um das Problem zu sehen. Vielleicht ist es das Problem von "CryptoCurrencyPCL" oder es dauert zu lange, um Daten zu laden. Weil die Today-Erweiterung nicht für eine langwierige Aufgabe verwendet werden sollte. –
Sehr seltsames Problem ist, dass es am Simulator funktioniert, aber nicht am realen Gerät –
gibt es einen Unterschied zwischen Simulator und realem Gerät. Vielleicht haben Sie zu viele Daten, versuchen Sie, Ihre Datenmenge zu reduzieren und erneut zu debuggen. –