Делегирование Xamarin ios

Как правильно использовать шаблон делегирования в Xamarin?

в определениях API (сгенерированных sharpie) у меня есть протокол, сопоставленный с Interface SomeDelegate:

// @protocol SomeDelegate <NSObject>
    [Protocol, Model]
    [BaseType (typeof(NSObject))]
    interface SomeDelegate
    {
        // @required -(void)someMethod;
        [Abstract]
        [Export ("someMethod")]
        void SomeMethod;
        ...

Я объявил контроллер представления следующим образом:

public partial class ViewController : UIViewController

но я не могу заставить контроллер представления реализовать мой протокол следующим образом: (не может иметь несколько базовых классов)

public partial class ViewController : UIViewController, SomeDelegate

Я могу реализовать это delegate в каком-нибудь дополнительном классе:

public ViewControllerDelegate : SomeDelegate

и использовать этот класс в качестве делегата, но для меня это не совсем удобный способ.

Я недавно обнаружил это, добавив «I»:

public partial class ViewController : UIViewController, ISomeDelegate

Я избегаю "ошибки нескольких базовых классов", поскольку (я предполагаю) явно говорю компилятору, что это интерфейс (протокол), а не базовый класс.

Теперь мне нужно передать делегат в качестве параметра метода и получить ошибку компиляции - не могу преобразовать тип SomeDelegate в SomeDelegate

Есть ли способ реализовать delegates в некоторых классах, таких как UIViewController (что угодно)?


person Injectios    schedule 18.04.2016    source источник
comment
Мне нужно что-то вроде этого stackoverflow.com/questions/21821003/, но это не работает   -  person Injectios    schedule 18.04.2016
comment
Убедитесь, что ISomeDelegate - это интерфейс. Тогда похоже, что у вас может быть какое-то столкновение пространств имен, где SameDelagate определен в разных пространствах имен, поэтому не совместим   -  person wishmaster    schedule 19.04.2016
comment
Проект привязки добавит префикс интерфейса «I» к любому интерфейсу, имеющему атрибуты [Модель, Протокол]. Проблема в том, что вы не можете определить какие-либо свойства в библиотеке привязки, которые относятся к типу ISomeDelegate. Вы уверены, что в классе, определяющем метод, нет свойств WeakDelegate / Delegate? Это ваша собственная библиотека или сторонняя? Можете ли вы опубликовать заголовок (ы)?   -  person SKall    schedule 19.04.2016


Ответы (1)


Попробуйте это для обратного вызова / делегата в Xamarin iOS:

Определите интерфейс для вашего метода:

public interface sampleDelegate{
    void GetSelectedItem();
}         

В destinationViewController объявите WeakReference своего интерфейса и выполните вызов:

public partial class SuggesterTableViewController : BaseSuggesterTableViewController{
    public WeakReference <sampleDelegate> _workerDelegate;
    public SuggesterTableViewController(IntPtr handle) : base(handle){
    }
    public sampleDelegate WorkerDelegate{
        get{
            sampleDelegate workerDelegate;
            return _workerDelegate.TryGetTarget(out workerDelegate) ? workerDelegate : null;
        }
        set{
            _workerDelegate = new WeakReference<sampleDelegate>(value);
        }
    }
    public override void RowSelected(UITableView tableView, NSIndexPath indexPath){
        if (_workerDelegate != null)
            WorkerDelegate?.GetSelectedItem();
    }
}

В вашем sourceViewController реализуйте интерфейс:

public partial class SomeViewController : UIViewController,sampleDelegate{
    public void openSuggestorView(){
        SuggesterTableViewController suggestVC = (SuggesterTableViewController)this.Storyboard.InstantiateViewController("SuggestTableVC");
        suggestVC._workerDelegate = new WeakReference<sampleDelegate>(this);

    }

    public void GetSelectedItem(){
        Console.WriteLine("Callback called");
    }
}
person iosDeveloper    schedule 30.07.2017