Я создал UITableView
с UIPickerView
в ячейке. Я хочу добавить значения в окне выбора и перейти к выбранному пользователем элементу.
Метод UpdateCell
добавляет значения в сборщик, а метод AddSelection
выбирает индекс элемента выбора.
Я получаю исключение из диапазона, потому что AddSelection
пытается выбрать индекс, но UpdateCell
еще не завершено. Это работает только с индексом 0.
Внутри PreOrderMenuTableSource
класс ...
public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
{
// Product Title
if (indexPath.Section == 0) {
cellIdentifier = new NSString ("preOrderMenuInfoCell");
var cell = tableView.DequeueReusableCell (cellIdentifier) as PreOrderMenuDescriptionCell;
cell.UpdateCell (SelectedMenu);
return cell;
}
// Product Description
if (indexPath.Section == 1) {
cellIdentifier = new NSString ("preOrderMenuDescCell");
var cell = tableView.DequeueReusableCell (cellIdentifier) as PreOrderMenuTitleCell;
cell.UpdateCell (SelectedMenu);
return cell;
}
//Product Type Cell
if (indexPath.Section == 2) {
cellIdentifier = new NSString ("preOrderTypeCell");
var cell = tableView.DequeueReusableCell (cellIdentifier) as PreOrderMenuTypeCell;
cell.UpdateCell (SelectedMenu);
cell.AddSelection (SelectedMenu);
return cell;
}
// Comments
if (indexPath.Section == 3) {
cellIdentifier = new NSString ("preOrderMenuCommentCell");
var cell = tableView.DequeueReusableCell (cellIdentifier) as PreOrderMenuCommentCell;
cell.Setup (tableView, indexPath);
return cell;
}
else {
return null;
}
}
PreOrderMenuTypeCell
следующий ...
partial class PreOrderMenuTypeCell : UITableViewCell
{
public PreOrderMenuTypeCell (IntPtr handle) : base (handle)
{
}
public void UpdateCell (MobilePreOrderMenuModel selectedProduct)
{
TypeTitle.Text = selectedProduct.Menu [0].Types[0].Name;
var typePickerModel = new PreOrderTypePickerModel (selectedProduct.Menu [0].Types [0].Products);
TypePicker.Model = typePickerModel;
}
public void AddSelection (MobilePreOrderMenuModel selectedProduct)
{
TypePicker.Select (0, SelectedOrDefault (selectedProduct.Menu [0].Types [0].Products), true);
}
private int SelectedOrDefault (List<MobilePreOrderProductDetails> products)
{
var selected = products.Where (x => x.IsSelected).FirstOrDefault ();
if (selected != null) {
return selected.Sequence.Value-1;
}
else {
var defaultSelected = products.OrderBy (x => x.Sequence).FirstOrDefault ();
defaultSelected.IsSelected = true;
return 0;
}
}
}
PreOrderTypePickerModel
- это следующее ...
public class PreOrderTypePickerModel : UIPickerViewModel
{
static List<MobilePreOrderProductDetails> _viewModel;
static int _selectedIndex;
public PreOrderTypePickerModel (List<MobilePreOrderProductDetails> viewModel)
{
_viewModel = viewModel;
}
public static string SelectedProductName {
get {
return _viewModel [_selectedIndex].Name;
}
}
public override void Selected (UIPickerView pickerView, nint row, nint component)
{
_selectedIndex = (int)row;
foreach (var item in _viewModel) {
item.IsSelected = false;
}
_viewModel[_selectedIndex].IsSelected = true;
}
public override nint GetRowsInComponent (UIPickerView pickerView, nint component)
{
return _viewModel.Count;
}
public override nint GetComponentCount (UIPickerView pickerView)
{
return 1;
}
public override UIView GetView (UIPickerView pickerView, nint row, nint component, UIView view)
{
var label = new UILabel ();
label.Text = _viewModel [(int)row].Name;
label.BackgroundColor = UIColor.Clear;
label.TextAlignment = UITextAlignment.Left;
label.Font = UIFont.FromName ("Helvetica", 14);
label.TextColor = UIColor.DarkGray;
return label;
}
}