Skip to content

Instantly share code, notes, and snippets.

@thefex
Created April 17, 2019 10:29
Show Gist options
  • Save thefex/6d6ca283c3aeb3a44d8cc237c7a50bab to your computer and use it in GitHub Desktop.
Save thefex/6d6ca283c3aeb3a44d8cc237c7a50bab to your computer and use it in GitHub Desktop.
Mvx iOS template selector
public abstract class MvxBaseTableViewCell : MvxTableViewCell
{
public IMvxViewModel ParentViewModel { get; set; }
public UITableView TableView { get; set; }
public MvxBaseTableViewSource TableViewSource { get; set; }
public Func<UIViewController> ParentViewControllerProvider { get; set; }
public NSIndexPath IndexPath { get; set; }
protected MvxBaseTableViewCell()
{
}
protected MvxBaseTableViewCell(string bindingText) : base(bindingText)
{
}
protected MvxBaseTableViewCell(IEnumerable<MvxBindingDescription> bindingDescriptions) : base(bindingDescriptions)
{
}
protected MvxBaseTableViewCell(string bindingText, CGRect frame) : base(bindingText, frame)
{
}
protected MvxBaseTableViewCell(IEnumerable<MvxBindingDescription> bindingDescriptions, CGRect frame) : base(bindingDescriptions, frame)
{
}
protected MvxBaseTableViewCell(IntPtr handle) : base(handle)
{
}
protected MvxBaseTableViewCell(string bindingText, IntPtr handle) : base(bindingText, handle)
{
}
protected MvxBaseTableViewCell(IEnumerable<MvxBindingDescription> bindingDescriptions, IntPtr handle) : base(bindingDescriptions, handle)
{
}
protected MvxBaseTableViewCell(string bindingText, UITableViewCellStyle cellStyle, NSString cellIdentifier, UITableViewCellAccessory tableViewCellAccessory = UITableViewCellAccessory.None) : base(bindingText, cellStyle, cellIdentifier, tableViewCellAccessory)
{
}
protected MvxBaseTableViewCell(IEnumerable<MvxBindingDescription> bindingDescriptions, UITableViewCellStyle cellStyle, NSString cellIdentifier, UITableViewCellAccessory tableViewCellAccessory = UITableViewCellAccessory.None) : base(bindingDescriptions, cellStyle, cellIdentifier, tableViewCellAccessory)
{
}
}
public class MvxBaseTableViewSource : MvxTableViewSource
{
private readonly IMvxView _parentView;
protected const int IncrementalLoadThreshold = 10;
private bool isLoadingNewItems;
public MvxBaseTableViewSource(UITableView tableView, IMvxView parentView) : base(tableView)
{
_parentView = parentView;
tableView.RowHeight = UITableView.AutomaticDimension;
tableView.EstimatedRowHeight = 60;
}
public MvxBaseTableViewSource(IntPtr handle) : base(handle)
{
}
public IMvxViewModel ParentDataContext => _parentView.ViewModel;
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
if (TemplateSelector == null)
throw new InvalidOperationException("Template selector is not set!");
var cell = TemplateSelector.DequeueReusableCell(item);
if (cell is MvxBaseTableViewCell tableViewCell)
{
tableViewCell.ParentViewModel = ParentDataContext;
tableViewCell.TableView = TableView;
tableViewCell.TableViewSource = this;
tableViewCell.ParentViewControllerProvider = ParentViewControllerProvider;
tableViewCell.IndexPath = indexPath;
}
return cell;
}
public override nfloat GetHeightForHeader(UITableView tableView, nint section)
{
return 0;
}
public MvxTemplateSelector TemplateSelector { get; set; }
public Func<UIViewController> ParentViewControllerProvider { get; set; }
}
public abstract class MvxTemplateSelector
{
private readonly UITableView _tableView;
private readonly HashSet<Type> _registeredCellTypes;
public MvxTemplateSelector(UITableView tableView)
{
_tableView = tableView;
_registeredCellTypes = new HashSet<Type>();
}
public UITableViewCell DequeueReusableCell(object forDataContext)
{
var cellType = GetCellType(forDataContext);
if (!_registeredCellTypes.Contains(cellType))
{
_tableView.RegisterClassForCellReuse(cellType, cellType.ToString());
_registeredCellTypes.Add(cellType);
}
return _tableView.DequeueReusableCell(cellType.ToString());
}
public abstract Type GetCellType(object forDataContext);
}
public abstract class MvxTemplateSelector<TItem> : MvxTemplateSelector where TItem : class
{
protected MvxTemplateSelector(UITableView tableView) : base(tableView)
{
}
public override Type GetCellType(object forDataContext)
{
return GetCellTypeForDataContext(forDataContext as TItem);
}
public abstract Type GetCellTypeForDataContext(TItem dataContext);
}
public class SampleTemplateSelector : MvxTemplateSelector<LoadableItem<Sample>>
{
public SampleTemplateSelector(UITableView tableView) : base(tableView)
{
}
public override Type GetCellTypeForDataContext(LoadableItem<Sample> dataContext)
{
var contentType = dataContext.Item.ContentType;
if (contentType.Equals("test"))
return typeof(TestTableViewCell);
else if (contentType.Equals("offer"))
return typeof(OfferTableViewCell);
throw new InvalidOperationException(contentType + " unknown content type");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment