我试图通过单击自定义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);
}