Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Xamarin-将目标添加到UILongPressGestureRecognitor,并将在父UIViewController中实现的选择器传递给它_C#_Ios_Xamarin_Segue_Viewcontroller - Fatal编程技术网

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元素和重新加载等。为此,my
UIViewController
方法必须调用数据访问层,因此将该方法放置在视图层次结构的该级别是有意义的

我遵循了来自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
}