Created
April 17, 2019 10:29
-
-
Save thefex/6d6ca283c3aeb3a44d8cc237c7a50bab to your computer and use it in GitHub Desktop.
Mvx iOS template selector
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
{ | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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