Как заставить работать UIDocumentInteractionController в MonoTouch - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь открыть файл * .epub через мое приложение, и я не совсем понимаю, как сделать это с помощью класса UIDocumentInteractionController.Я видел официальную IOS документацию и примеры и некоторые из примеров над сетью , но я не понимаю, как этот классработает.Вот как я это делаю, чего я добиваюсь и чего я не понимаю:

У меня есть UIView с UIButton:

using MonoTouch.UIKit;
using MonoTouch.Foundation;
using System.Drawing;

public class MyView : UIViewController
{
    UIButton myBtn;

    public MyView() :base()
    {
        View.Frame = new RectangleF(0,0,1024,768);

        var myRect = new RectangleF(300,300,100,50);

        myBtn = UIButton.FromType(UIButtonType.RoundedRect);
        myBtn.Frame = myRect;
        myBtn.TouchUpInside += delegate
        {
            var dic = UIDocumentInteractionController.FromUrl(new NSUrl("http://192.168.50.50:2020/myfile.epub"));
            var dicDel = new UIDocumentInteractionControllerDelegate();
            dic.Delegate = dicDel;

            InvokeOnMainThread(delegate
            {
                var result = dic.PresentOpenInMenu(myRect, View, true);
                //If I do this -> NullReferenceException because delegate is null (something about autorelease?? Don't know)
                if(!result) dic.Delegate.DidDismissOpenInMenu(dic);
            });


        }
    }
}

Самое странное, если я отлаживаю и проверяю "dic"(без делегата) перед вызовом метода PresentOpenInMenu () он показывает меню (возвращает true), но только после этого приложение взрывается в Main.cs, потому что я не понимаю, что такое autorelease.

Янемного потерян.Может ли кто-нибудь помочь мне понять этот класс и как я могу заставить его работать правильно?Заранее спасибо.

РЕДАКТИРОВАТЬ : Кстати, я тоже использовал файл * .txt с теми же результатами.

1 Ответ

0 голосов
/ 23 ноября 2011

Похоже, ошибка MonoTouch. Установка свойства UIDocumentInteractionController.Delegate (или WeakDelegate и последующий запрос его значения) возвращает null (что позже приведет к ошибке).

Я посмотрю на эту ошибку и обновлю этот ответ, если смогу предложить обходной путь (пока ошибка не будет исправлена ​​в следующем выпуске MonoTouch).

ОБНОВЛЕНИЕ : UIDocumentInteractionController уже создает собственный внутренний UIDocumentInteractionControllerDelegate, поэтому вам не нужно его создавать. Методы Делегата, такие как DidDismissOpenInMenu, доступны как события на самом UIDocumentInteractionController.

Удалите свой собственный Делегат (создание и настройка) и используйте события, и у вас все будет хорошо.

UPDATE # 2 : свойство Delegate возвращает значение NULL, поскольку значение по умолчанию UIDocumentInteractionControllerDelegate не может использоваться как есть. Он предназначен для наследования и настройки для выполнения того, что вы хотите (а непригодный по умолчанию не зарегистрирован должным образом для использования). Э.Г.

class MyDocumentInteractionControllerDelegate : UIDocumentInteractionControllerDelegate { }

и

var dicDel = new MyDocumentInteractionControllerDelegate ();

будет работать , как нет NullReferenceException, но, конечно, DidDismissOpenInMenu не будет делать ничего интересного.

...