自定义LabelRenderer在Xamarin iOS的滚动列表视图中显示错误的文本样式



我正在开发一个应用程序,该应用程序需要一个列表视图,该视图在用户删除时具有NSUnderlineStyle的文本标签。根据要求,用户在详细屏幕中有删除/恢复选项。在确认删除时,该特定单元格的文本标签应为下划线样式。

我在Xamarin iOS中使用用于NSUnderlineStyle的LabelRenderer。

但当前ListView显示带有下划线样式的文本标签,用户不会在列表视图滚动中删除该文本标签。在列表视图滚动中,下划线样式正在从一个单元格标签交换到另一个。

下面是我的示例代码。

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (this.Control == null)
{
return;
}
if (this.Element is ExtendedLabel extended)
{
var strikethroughStyle = extended.IsStrikeThrough ? NSUnderlineStyle.Single : NSUnderlineStyle.None;
this.Control.AttributedText = new NSMutableAttributedString(
extended.Text ?? string.Empty,
this.Control.Font,
strikethroughStyle: strikethroughStyle);
}
}

这是TableView Cell Resue的常见问题,TableView会将单元格重新用于可见的(屏幕内(单元格,因此它会显示以前的样式。

为了解决这个问题,我们可以在每次显示单元格时强制设置样式。

ListView创建自定义渲染器,并在WillDisplay方法中执行此操作,然后我们需要覆盖TableView's Delegate

[assembly: ExportRenderer(typeof(ListView), typeof(MyRenderer))]
namespace FormsApp.iOS
{
public class MyDelegate : UITableViewDelegate
{
List<Model> data;
public MyDelegate(List<Model> _data)
{
data = _data;
}
public override void WillDisplay(UITableView tableView, UITableViewCell cell, NSIndexPath indexPath)
{
var views = cell.ContentView.Subviews;
foreach (var view in views)
{
if(view is LabelRenderer renderer)
{
UILabel label = renderer.Control;
var strikethroughStyle = data[indexPath.Row].YourProperty?NSUnderlineStyle.Single : NSUnderlineStyle.None;
label.AttributedText = new NSMutableAttributedString(
label.Text ?? string.Empty,
label.Font,
strikethroughStyle: strikethroughStyle);
}
}
}
}
public class MyRenderer : ListViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Unsubscribe
}
if (e.NewElement != null)
{
IEnumerable<Model> data = (IEnumerable<Model>)Element.ItemsSource;
Control.Delegate = new MyDelegate(data.ToList());
}
}
}   
}

相关内容

最新更新