2010-01-30 63 views
1

我只能找到点点滴滴,没有全面的解释和帮助,特别是在MonoTouch中。如何删除和重新排序UITableView中的行?

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

我只是不知道我应该如何管理修改数据源并重新绑定(我想用.NET术语来说,我认为这是问题的一部分)。

谢谢。

回答

2

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

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); 
     } 
    } 
}