2015-03-08 3 views
0

Я абсолютный новичок в iOS.Почему EditActionsForRow никогда не будет вызван?

Я хочу, чтобы на столе были активные действия, но даже если я устанавливаю соответствующий подкласс делегата, метод EditActionsForRow никогда не вызывается на нем.

Вот мой код:

using System; 
using UIKit; 
using Foundation; 
using System.Linq; 
using System.Diagnostics; 

namespace Tasky { 
    public partial class TaskyViewController : UIViewController { 
     TasksRepository tasksRepository; 
     TaskItemViewSource tasksViewSource; 

     public TaskyViewController (IntPtr handle) : base (handle) { 
      tasksRepository = new TasksRepository(); 

      tasksViewSource = new TaskItemViewSource(); 
      tasksViewSource.Data = new TaskItem[0]; 
      tasksViewSource.DeleteClicked += HandleTaskDeleteClicked; 
     } 

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

      TasksTable.Delegate = tasksViewSource; 
      TasksTable.Source = tasksViewSource; 
     } 

     public async override void ViewDidAppear (bool animated) { 
      base.ViewDidAppear (animated); 

      var tasks = await tasksRepository.GetAllTasksAsync(); 
      tasksViewSource.Data = tasks.ToArray(); 
      TasksTable.ReloadData(); 
     } 

     async void HandleTaskDeleteClicked (object sender, NSIndexPath e) { 
      await tasksRepository.DeleteTaskAsync (tasksViewSource.Data [e.Row]); 
      TasksTable.ReloadData(); 
     } 
    } 

    public class TaskItemViewSource : UITableViewSource, IUITableViewDelegate { 
     public TaskItem[] Data { get; set; } 

     public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) { 
      var task = Data [indexPath.Row]; 
      UITableViewCellStyle cellStyle; 
      if (String.IsNullOrEmpty (task.Description)) { 
       cellStyle = UITableViewCellStyle.Default; 
      } else { 
       cellStyle = UITableViewCellStyle.Subtitle; 
      } 

      var taskCell = new UITableViewCell (cellStyle, "TaskCell"); 
      taskCell.TextLabel.Text = Data [indexPath.Row].Title; 

      if (!String.IsNullOrEmpty (task.Description)) { 
       taskCell.DetailTextLabel.Text = Data [indexPath.Row].Description; 
      } 

      return taskCell; 
     } 

     public override nint RowsInSection (UITableView tableView, nint section) { 
      return Data.Length; 
     } 

     public override void RowSelected (UITableView tableView, NSIndexPath indexPath) { 
      Debug.WriteLine ("Deselected row #" + indexPath.Row); 
      tableView.DeselectRow (indexPath, true); 
     } 

     public event EventHandler<NSIndexPath> DeleteClicked; 

     public override UITableViewRowAction[] EditActionsForRow (UITableView tableView, NSIndexPath indexPath) { 
      Debug.WriteLine ("Inflating edit actions..."); 
      var deleteButton = UITableViewRowAction.Create (
       UITableViewRowActionStyle.Destructive, 
       "Delete", 
       (action, index) => { 
        if (DeleteClicked != null) { 
         DeleteClicked (this, index); 
        } 
       }); 
      return new [] { deleteButton }; 
     } 
    } 
} 

EDIT: мне удалось сплавить делегат и источник вида с замечанием Джейсона, теперь отменой пометки работает нормально.

ответ

0

Xamarin's TableSource объединяет две родные концепции iOS, DataSource и делегат. Xamarin также обеспечивает сопоставление классов DataSource и Delegate. Однако вы не должны смешивать TableSource с DataSource и Delegate.

От Xamarin-х TableView docs:

Если вы смотрите на код Objective-C или документации, иметь в виду, что Xamarin.iOS агрегаты протокол UITableViewDelegate и класс UITableViewDataSource в этом одном классе. Не существует сопоставимого класса или протокола UITableViewSource в Objective-C.

+0

Это работало частично. См. Обновленный вопрос. – Machinarius

Смежные вопросы