我遇到了UICollectionView的问题,完全与单元格有关...当我向下滚动并返回时,一些单元格只是空的。他们只是消失了这样的事情:
OrdersView中的我的ViewDidLoad():
public override void ViewDidLoad()
{
Title = "My Orders..";
base.ViewDidLoad();
ordersCollectionView.Frame = new CGRect(ordersCollectionView.Frame.X, ordersCollectionView.Frame.Y, ordersCollectionView.Frame.Width, ordersCollectionView.Frame.Height);
ordersCollectionView.ScrollEnabled = true;
var layout = new UICollectionViewFlowLayout
{
ItemSize = new CGSize() { Width = ordersCollectionView.Bounds.Width, Height = 80 },
MinimumInteritemSpacing = 0,
MinimumLineSpacing = 2,
ScrollDirection = UICollectionViewScrollDirection.Vertical
};
ordersCollectionView.SetCollectionViewLayout(layout, true);
this.ClearBindings(_source);
_source = new OrdersCollectionViewSource(ordersCollectionView);
this.AddBindings(new Dictionary<object, string>
{
{ _source, "ItemsSource Orders; SelectedItem SelectedOrder; SelectionChangedCommand ShowOrderDetailCommand" }
});
ordersCollectionView.Source = _source;
ordersCollectionView.ReloadData();
Mvx.Resolve<IMvxMessenger>().SubscribeOnMainThread<OrdersLoadedMessage>(mess =>
{
this.ClearBindings(_source);
_source = new OrdersCollectionViewSource(ordersCollectionView);
this.AddBindings(new Dictionary<object, string>
{
{ _source, "ItemsSource Orders; SelectedItem SelectedOrder; SelectionChangedCommand ShowOrderDetailCommand" }
});
ordersCollectionView.Source = _source;
ordersCollectionView.ReloadData();
}, MvxReference.Strong);
InitializeRefreshControl();
ViewMessages.ViewCreatedMessages(this, "OrdersView", ViewModel);
}
OrdersCollectionViewSource:
public class OrdersCollectionViewSource : MvxCollectionViewSource
{
private static readonly NSString CellIdentifier = new NSString("OrdersCollectionViewCell");
public OrdersCollectionViewSource(UICollectionView collectionView) : base(collectionView)
{
collectionView.RegisterClassForCell(typeof(OrdersCollectionViewCell), CellIdentifier);
}
protected override UICollectionViewCell GetOrCreateCellFor(UICollectionView collectionView, NSIndexPath indexPath, object item)
{
var cell = (UICollectionViewCell)collectionView.DequeueReusableCell(CellIdentifier, indexPath);
cell.BackgroundColor = UIColor.FromRGB(237, 237, 237);
return cell;
}
}
OrdersCollectionViewCell:
public class OrdersCollectionViewCell : MvxCollectionViewCell
{
[Export("initWithFrame:")]
public OrdersCollectionViewCell(CGRect frame) : base(frame)
{
Layer.BackgroundColor = new CGColor(220, 25, 25, 255);
//left
var labelName = new UILabel();
labelName.Frame = new CGRect(10f, 15f, (float)(Bounds.Width / 2 + 20), 20f);
labelName.Font = UIFont.PreferredHeadline;
labelName.TextColor = UIColor.FromRGBA(90, 24, 24, 255);
labelName.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
labelName.Text = "Text";
var labelPickupDate = new UILabel();
labelPickupDate.Frame = new CGRect(10f, 45f, (float)(Bounds.Width / 2 - 10), 20f);
labelPickupDate.Font = UIFont.PreferredBody;
labelPickupDate.TextColor = UIColor.Black;
labelPickupDate.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
//right
var labelPrice = new UILabel();
labelPrice.Frame = new CGRect((float)(Bounds.Width / 2), 45f, (float)(Bounds.Width / 2 - 10), 20f);
labelPrice.TextAlignment = UITextAlignment.Right;
labelPrice.Font = UIFont.PreferredBody;
labelPrice.TextColor = UIColor.Black;
labelPrice.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
var labelStatus = new UILabel();
labelStatus.Frame = new CGRect((float)(Bounds.Width / 2), 15f, (float)(Bounds.Width / 2 - 10f), 20f);
labelStatus.TextAlignment = UITextAlignment.Right;
labelStatus.Font = UIFont.PreferredHeadline;
labelStatus.TextColor = UIColor.FromRGBA(15, 113, 10, 255);
labelStatus.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin;
Add(labelName);
Add(labelPickupDate);
Add(labelStatus);
Add(labelPrice);
this.DelayBind(() =>
{
var set = this.CreateBindingSet<OrdersCollectionViewCell, Order>();
set.Bind(labelPickupDate).For(q => q.Text).To(vm => vm.PickupDate).WithConversion("StringDateTimeConverter");
set.Bind(labelStatus).For(q => q.Text).To(vm => vm.OrderStatus);
set.Bind(labelPrice).To(vm => vm.Sum).WithConversion("CreditConverter");
set.Apply();
});
}
}
我在这里发现了一些类似的问题,但xcode中的所有内容..所以我尝试了一些东西,但它仍然无法正常工作。
编辑 - 我的解决方案:
protected override UICollectionViewCell GetOrCreateCellFor(UICollectionView collectionView, NSIndexPath indexPath, object item)
{
var cell = (UICollectionViewCell)collectionView.DequeueReusableCell(CellIdentifier, indexPath);
cell.BackgroundColor = UIColor.FromRGB(237, 237, 237);
var order = (Order) item;
var test = (OrdersCollectionViewCell) cell;
test.labelName.Text = "Name";
test.labelPickupDate.Text = StringConvertor.StringDateTime(order.PickupDate);
test.labelPrice.Text = StringConvertor.PriceConvertor(order.Sum);
test.labelStatus.Text = order.OrderStatus;
return test;
}
答案 0 :(得分:0)
我有一个非常类似的问题。这是因为你的表重用了单元格。滚动时dequeueReusableCellWithIdentifier
将重复使用相同的单元格引用,它可能无法保留您要显示的文本。
您的GetOrCreateCellFor
功能包含对DequeueReusableCell
的调用。您还应该在此函数中设置单元格的文本(例如cell.labelName.text = "my text here"
)。
protected override UICollectionViewCell GetOrCreateCellFor(UICollectionView collectionView, NSIndexPath indexPath, object item)
{
var cell = (UICollectionViewCell)collectionView.DequeueReusableCell(CellIdentifier, indexPath);
cell.BackgroundColor = UIColor.FromRGB(237, 237, 237);
cell.labelName.text = "Your label here"
cell.labelPickupDate.text = "Your pickup date here"
cell.labelPrice.text = "Your price here"
cell.labelStatus.text = "Your status here"
return cell;
}
请参阅下面的答案以获取完整说明。如果您有任何问题,请告诉我。