【问题标题】:Bind second UITableView on RowClick of first UITableView in the same UIViewController - ios Xamarin在同一个 UIViewController 中的第一个 UITableView 的 RowClick 上绑定第二个 UITableView - ios Xamarin
【发布时间】:2017-02-01 19:02:09
【问题描述】:

我在同一个UIViewController 中有两个UITableView。 tblView1 和 tblView2。

两个 TableView 都动态地带来数据。 现在我的问题是:我想在tblView1的SelectedRow的基础上加载tblView2中的数据。

例如,当我从 tblView1 中选择公司名称时,tblView2 需要填充该公司制造的汽车。

我有我的第一个表 (tblView1) 的 rowIndex,但我无法从 tblView1 的 RowSelected 方法绑定我的 tblView2。 我需要帮助来绑定我的 tblView2。 我该怎么做?

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using CoreGraphics;
using Foundation;
using UIKit;

namespace Tables
{
    public partial class ViewController : UIViewController
    {
        protected ViewController(IntPtr handle) : base(handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        public ViewController()
        {
            //tblView2.Source = new CompanyModelsSource();

            // Note: this .ctor should not contain any initialization logic.
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            if (tblView1 != null)
            {
                tblView1.Source = new CarModelsSource();

            }
            // Perform any additional setup after loading the view, typically from a nib.
        }

        public override void DidReceiveMemoryWarning()
        {
            base.DidReceiveMemoryWarning();
            // Release any cached data, images, etc that aren't in use.
        }
    }

    class CompanyModelsSource : UITableViewSource
    {
        private List<Companies> _Companies;
        NSString _cellID = new NSString("TableCell");

        public CompanyModelsSource()
        {
            _Companies = CompanyTableSource.AllCompany();
        }

        public override nint RowsInSection(UITableView tableview, nint section)
        {
            // tell the TableView how many rows to create
            return _Companies.Count;
        }

        public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
        {
        //I can't access my tblView2 in this method. So where i can bind my other UITableView?

            UILabel lblTotalFacilities = new UILabel();
            lblTotalFacilities.Layer.BackgroundColor = UIColor.Blue.CGColor;
            lblTotalFacilities.Frame = new CGRect(305, 200, 1024, 400);

            ViewController vc = new ViewController();
            vc.View.AddSubview(lblTotalFacilities);
        }

        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            Company currentCompany = _Companies[indexPath.Row];

            var cell = tableView.DequeueReusableCell(_cellID) as CompanyTableCell;
            if (cell == null) { cell = new CompanyTableCell(_cellID); }

            cell.UpdateCellControlsWithAuditData(currentCompany.Name);

            return cell;
        }
    }

    public class CompanyTableSource
    {
        public CompanyTableSource()
        {
        }

        public static List<Companies> AllCompany()
        {
            CompanyCollection CC = null;

            string path1 = path + "Companies.xml";

            XmlSerializer serializer = new XmlSerializer(typeof(CompanyCollection));

            StreamReader reader = new StreamReader(path1);
            CC = (CompanyCollection)serializer.Deserialize(reader);
            reader.Close();

            List<Companies> comp = CC.CompanyCollection.Cast<Companies>().ToList();
            return comp;
        }
    }

    public class CompanyTableCell : UITableViewCell
    {
        UILabel nameLabel;
        public CompanyTableCell(NSString cellId) : base(UITableViewCellStyle.Default, cellId)
        {
            SelectionStyle = UITableViewCellSelectionStyle.Gray;
            ContentView.BackgroundColor = UIColor.FromRGB(54, 194, 36);

            var newFont = UIFont.SystemFontOfSize(12);

            nameLabel = new UILabel();
            nameLabel.Font = newFont;

            ContentView.AddSubviews(new UIView[] { nameLabel });
        }


        public void UpdateCellControlsWithAuditData(string Name)
        {
            nameLabel.Text = Name;

        }

        public override void LayoutSubviews()
        {
            base.LayoutSubviews();
            nameLabel.Frame = new CGRect(10, 0, 350, 33);

        }
    }
}

【问题讨论】:

  • 在 CompanyTableSource 类中创建一个公共事件并从 ViewController 订阅它,然后在该 DataSource 的 RowSelected 方法中引发事件。在 ViewController 中,您将拥有一个将收到通知的事件处理程序,并且您将能够根据第一个 tableview 的 RowSelected 获取第二个 tableView 所需的信息。 (这里没有 VS 给你看代码,希望这至少能给你一个想法)
  • 如果你能帮助我,我可以为你提供我的 TeamViewer。
  • @apineda 或者你能给我一个例子的链接吗?/

标签: c# ios uitableview xamarin uiviewcontroller


【解决方案1】:

希望这会有所帮助。为简单起见,将所有内容都创建在一个文件中。

public partial class ViewController : UIViewController
{
    public ViewController() : base("ViewController", null)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // Perform any additional setup after loading the view, typically from a nib.

        var companySource = new CompanyTableSource();
        tblView1.Source = companySource;

        companySource.ItemSelected += OnCompanyItemSelected;
    }

    //this will handle the ItemSelected event
    //here you will retrieve the data for the second UITableView
    void OnCompanyItemSelected(object sender, Company e)
    {
        //you can do it this way
        tblView2.Source = new CarTableSource(e.Id);

        List<Car> cars = GetCarsByCompanyId(e.Id);

        //or this whay
        tblView2.Source = new CarTableSource(cars);
    }

    List<Car> GetCarsByCompanyId(int id)
    {
        //Your logic to get the data goes here
        throw new NotImplementedException();
    }
}

public class CompanyTableSource : UITableViewSource
{
    // You can use the whole object or just an integer (companyId)
    public event EventHandler<Company> ItemSelected;

    public IList<Company> Items { get; private set; } = new List<Company>();

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
        var item = Items[indexPath.Row];

        ItemSelected?.Invoke(this, item);
    }

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        //Do your implementation
        throw new NotImplementedException();
    }

    public override nint RowsInSection(UITableView tableview, nint section)
    {
        return Items.Count;
    }
}

public class CarTableSource : UITableViewSource
{

    public IList<Car> Items { get; private set; } = new List<Car>();

    public CarTableSource(int companyId)
    { 
        //Get your data based on the companyId
    }

    //Or pass in the data already retreived. (I preffer this method)
    public CarTableSource(IList<Car> cars)
    {
        Items = cars;
    }

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        //Do your implementation
        throw new NotImplementedException();
    }

    public override nint RowsInSection(UITableView tableview, nint section)
    {
        return Items.Count;
    }
}

【讨论】:

  • 这以不同的方式对我有用。我试图在事件中绑定UITableView,但这不起作用,然后我在事件中动态创建UITableView,然后向他提供源代码并且它起作用了。 :-) 谢谢,你能看看我关于 Xamarin 的另一个问题吗? stackoverflow.com/q/41833049/4728323
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2013-05-18
相关资源
最近更新 更多