如何删除&在UITableView中重新排序行?

时间:2010-01-30 00:55:02

标签: iphone uitableview xamarin.ios

我只能找到点点滴滴,没有全面的解释和帮助,特别是在MonoTouch中。

我有一个UITableView,我有我的DataSource对象,我有自定义的CellController。我在自定义单元格上有按钮,我想让用户删除该行或在列表中向上或向下移动它。

我只是无法弄清楚我应该如何管理修改数据源并让它重新绑定(我用.NET术语思考,我认为这是问题的一部分)。

感谢。

2 个答案:

答案 0 :(得分:7)

以下是如何向表中添加删除,我不确定是否重新排序。在界面构建器中,将NavigationController添加到窗口,然后在其中添加TableViewController,并在属性窗口中将其类设置为MyTableViewController

我想我从教程中得到了这个,那里有很多演示。如果你找不到一个例子,你就值得浏览Miguel De Icaza's Github samples

亚历克斯约克的帖子也可以提供帮助,Deleting cells from a UITableView

[MonoTouch.Foundation.Register("MyTableViewController")]
public class MyTableViewController : UITableViewController
{
    public List<string> Items { get;set; }

    private UIBarButtonItem _buttonEdit;
    private UIBarButtonItem _buttonDone;

    public MyTableViewController(IntPtr ptr) : base(ptr)
    {   
        _buttonEdit = new UIBarButtonItem(UIBarButtonSystemItem.Edit);
        _buttonDone = new UIBarButtonItem(UIBarButtonSystemItem.Done);
        _buttonEdit.Clicked += Handle_buttonEditClicked;
        _buttonDone.Clicked += Handle_buttonDoneClicked;

        NavigationItem.RightBarButtonItem = _buttonEdit;
    }

    void Handle_buttonDoneClicked (object sender, EventArgs e)
    {
        Editing = false;
        NavigationItem.RightBarButtonItem = _buttonEdit;
    }

    void Handle_buttonEditClicked (object sender, EventArgs e)
    {
        Editing = true;
        NavigationItem.RightBarButtonItem = _buttonDone;
    }

    private void BindData()
    {
        Title = "Testing tables";
        Items = new List<string>() { "hello","world","big","bad","world"};
    }

    public override void ViewDidLoad ()
    {   
        base.ViewDidLoad ();    

        BindData();
        TableView.Delegate = new MyTableViewDelegate(this);
        TableView.DataSource = new MyTableDataSource(this);
    }

    public class MyTableDataSource : UITableViewDataSource
    {
        private MyTableViewController _tableViewController;

        public MyTableDataSource(MyTableViewController controller)
        {
            _tableViewController = controller;
        }

        public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
        {
            string cellid = "cellid"; 
            UITableViewCell cell = tableView.DequeueReusableCell(cellid); 

            if ( cell == null )
            {
                cell = new UITableViewCell(UITableViewCellStyle.Default, cellid);
                cell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
            }

            cell.TextLabel.Text = _tableViewController.Items[indexPath.Row];

            return cell; 
        }

        public override void CommitEditingStyle (UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
        {
            if (editingStyle == UITableViewCellEditingStyle.Delete)
            {
                _tableViewController.Items.RemoveAt(indexPath.Row);
                tableView.DeleteRows(new [] { indexPath }, UITableViewRowAnimation.Fade);
            }
        }


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

        public override string TitleForHeader (UITableView tableView, int section)
        {
            return "title";
        }
    }


    public class MyTableViewDelegate : UITableViewDelegate
    {
        private DetailsViewController _detailsViewController;
        private MyTableViewController _tableViewController;

        public MyTableViewDelegate(MyTableViewController controller)
        {
            _tableViewController = controller;  
        }

        public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
        {
            if (_detailsViewController == null)
                _detailsViewController = new DetailsViewController();

            _detailsViewController.CurrentItem = _tableViewController.Items[indexPath.Row];
            _tableViewController.NavigationController.PushViewController(_detailsViewController,true);
        }
    }
}

答案 1 :(得分:2)

我不熟悉monotouch,但在Objective-C API中,如果更新了数据源,则必须调用表的重载方法。