我试图通过单击自定义UICollectionViewCell中的按钮来了解执行segue的正确方法是什么(我正在使用情节提要创建应用程序的屏幕)。

我有一个视图控制器,其中包含一个UICollectionView:

    MyDataSource myDataSource = new MyDataSource(listOfItems);

    myCollectionView.Source = myDataSource;


MyDataSource是UICollectionViewSource的子类

     public override UICollectionViewCell GetCell(UICollectionView collectionView, Foundation.NSIndexPath indexPath)
     {
            MyCustomCell customListCell = (MyCustomCell)collectionView.DequeueReusableCell("listCell", indexPath);
            customListCell.updateItem(indexPath.Row);
            return customListCell;
     }


MyCustomCell updateItem方法更新单元格的属性,并为按钮连接TouchUpInside事件:

    public void updateItem(int index)
    {
         myButton.TouchUpInside += (sender, e) =>
         {
            /* NOW I WANT TO PERFORM THE SEGUE
               AND PASS THE INDEX THAT WAS CLICKED */
         };
    }


阅读一些旧问题后,提出了一些解决方案,我试图避免:


将引用传递给父级ViewController并使用该引用执行segue。
在情节提要中创建序列,当用户单击按钮时,保存所选内容的静态值,该值可以从下一个ViewController访问。


在我看来,这两种解决方案更像是一种解决方法,并且使用“事件”是正确的路径,但是我不确定实现方式。

因此,例如,我将在MyCustomCell中创建一个EventHandler:

public event EventHandler<MyDataType> ButtonClicked;


然后在TouchUpInside中:

    myButton.TouchUpInside += (sender, e) =>
    {
             ButtonClicked(this, MyDataType);
    };


但是要使此工作正常,我将需要在父视图控制器中使用此事件:

   MyCustomCell.ButtonClicked += (sender, e) =>
   {
                PerformSegue("theSegueIdentifier", this);
   };


我在父视图控制器中没有对MyCustomCell的任何引用,
那么如何在父视图控制器中使用此事件?

最佳答案

这个怎么样:

VC:

MyDataSource myDataSource = new MyDataSource(listOfItems,CurrentVC);

数据源:

this.currentVC = CurrentVC;

myButton.TouchUpInside += (sender, e) =>
{

     currentVC.PerformSegue("theSegueIdentifier", this);
     //currentVC is the instance of current controller
};


最好建议尝试this进行导航,然后无需创建Segue
与每个单元的Button相关:

NextViewController nextController = this.Storyboard.InstantiateViewController ("NextViewController") as NextViewController ;
if (nextController != null) {
     this.NavigationController.PushViewController (nextController, true);
}

10-08 07:40