Выберите индекс UIPIcker в ячейке UITableView - PullRequest
1 голос
/ 10 июля 2019

Я создал 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;
    }
}

1 Ответ

0 голосов
/ 11 июля 2019

Я изменяю AddSelection метод на этот

public void AddSelection (MobilePreOrderMenuModel selectedProduct)
{
    TypePicker.Select (SelectedOrDefault (selectedProduct.Menu [0].Types [0].Products),0, true);
}

Я исправил параметры на Select и теперь он работает.

enter image description here

Декларация для Select:

void UIPickerView.Select(nint row, nint component, bool animated);
...