C#Xamarin-将目标添加到UILongPressGestureRecognitor,并将在父UIViewController中实现的选择器传递给它
我很难将事件从C#Xamarin-将目标添加到UILongPressGestureRecognitor,并将在父UIViewController中实现的选择器传递给它,c#,ios,xamarin,segue,viewcontroller,C#,Ios,Xamarin,Segue,Viewcontroller,我很难将事件从UICollectionViewCell提升到父级UIViewController中存在的处理程序。我试图检测UICollectionViewCell上的长按,并在UIViewController中启动一个方法-将视图置于“编辑模式”显示/隐藏UI元素和重新加载等。为此,myUIViewController方法必须调用数据访问层,因此将该方法放置在视图层次结构的该级别是有意义的 我遵循了来自Adam Kemp的官方文档和技术以及伟大的建议 在Xamarin.IOS中实现这一点有很多
UICollectionViewCell
提升到父级UIViewController
中存在的处理程序。我试图检测UICollectionViewCell
上的长按,并在UIViewController
中启动一个方法-将视图置于“编辑模式”显示/隐藏UI元素和重新加载等。为此,myUIViewController
方法必须调用数据访问层,因此将该方法放置在视图层次结构的该级别是有意义的
我遵循了来自Adam Kemp的官方文档和技术以及伟大的建议
在Xamarin.IOS中实现这一点有很多相互冲突的方法。唉,就我的情况而言,目前似乎没有一个能起作用。我一定是做错了什么事
我有一个自定义类,它继承自UICollectionViewCell
,其中包含一个private uilongpressurerecognizer\u识别器代码>和名为UpdateCell
的方法如下:
public virtual void UpdateCell(bool CanEdit)
{
// Other properties and logic omitted for brevity (no relevance to question)
this._recognizer = new UILongPressGestureRecognizer();
this._recognizer.MinimumPressDuration = 0.5;
this._recognizer.AddTarget(this, new ObjCRuntime.Selector("OnEditModeActivated"));
this.AddGestureRecognizer(_recognizer);
}
我希望长按可在UIViewController中触发以下方法:
[Export("OnEditModeActivated")]
public async void OnEditModeActivated()
{
if (recognizer.State == UIGestureRecognizerState.Ended)
{
this._canEdit = true;
// call Data Access layer using await
_source.Dispose(); // dispose of current UICollectionViewSource object
_source = new UICollectionViewSource(_data, _canEdit);
UICollectionView.Source = _source;
}
}
引起问题的线路是
`this._recognizer.AddTarget(this, new ObjCRuntime.Selector("OnEditModeActivated:"));`
选择器应指向父级UIViewController
,它具有一个public void OnEditModeActivated
装饰有[导出(“OnEditModeActivated:”)]
我可以看到编译器运行到“无法识别的选择器”异常,因为这个(传递给AddTarget
)的第一个参数显然是UICollectionViewCell,而不是UIViewController
,因此它将通过UICollectionViewCell(实例)->OneActivated来解析AddTarget
(不存在)
我需要引用父级UIViewController
,而不是this
,但我不想通过引用UpdateCell
方法来传递它-这意味着将引用传递到许多层,因此我的代码变得有点像意大利面条
如果有人能用更好的方式解释,请放心。我曾考虑在UICollectionViewCell
实例中引发一个事件,但没有结果。此外,我似乎无法在Xamarin中获得正确的委派模式
问题在于我使用的层次结构是:UIViewController->UICollectionView->UICollectionViewSource->UICollectionViewCell
我确信可以在视图控制器级别引发事件/调用委托/调用方法并解决
谢谢你花时间帮忙
祝你一切顺利
John将\u识别器
连接到内容视图
,并在此
中声明了一个方法,解决了我的问题
我改变了:
this.AddGestureRecognizer(_recognizer);
致:
并在同一级别创建了一个OnLongPressed方法,该方法使用Export[“OnLongPressed:”]进行修饰,从而引发在
UIViewController`级别解析的事件
另外,UILongPressGestureRecognitor
会引发多个事件,您应该检查长按是否已实际结束,否则任何进一步的事件/方法调用都会发生多次,例如:
if(recognizer.State == UIGestureRecognizerState.Ended)
{
// Raise events call methods here only when the long press ended
}
ui长按gestureignizer
s将触发多个状态,您可以使用State
属性测试这些状态
if(recognizer.State == UIGestureRecognizerState.Ended)
{
// Raise events call methods here only when the long press ended
}