IMvxPictureChooserTask无法处理Xamarin.iOS

时间:2014-03-16 00:15:12

标签: xamarin.ios xamarin mvvmcross

在Xamarin.iOS上遇到IMvxPictureChooserTask问题。当第一次尝试TakePicture或ChoosePictureFromLibrary时 - 什么都没发生。日志中的所有下一次出现消息:

当任务已经激活时调用MvxImagePickerTask

,别无其他。

那么有人可以提供帮助或提出建议吗?

更新1

失败的代码:

public HomeViewModel(IDataService dataService, IApiService apiService, IMvxPictureChooserTask pictureChooserTask)
{
    _apiService = apiService;
    _dataService = dataService;
    _pictureChooserTask = pictureChooserTask;

    //Another staff here
}

private void DoAddPicture()
{
    _pictureChooserTask.TakePicture(400, 95, OnPicture, () => { });
}

更新2

问题在于我使用自定义演示器进行侧边菜单功能。它继承自MvxBaseTouchViewPresenter。没有这个,MvxImagePickerTask工作正常。

那么有人可以建议我如何同时使用MvxImagePickerTask和自定义演示者?或者可能是其他建议如何在基于MvvmCross的其他解决方案中同时具有这两种功能。

只需要在自定义演示者中覆盖PresentModalViewController:

public override bool PresentModalViewController(MonoTouch.UIKit.UIViewController viewController, bool animated)
{
    var currentViewController = _flyOutNavigationController.ViewControllers[_flyOutNavigationController.SelectedIndex] as UINavigationController;
    currentViewController.PresentViewController(viewController, true, null);
    return true;
}

2 个答案:

答案 0 :(得分:3)

使用Xamarin.Forms(Cheesebarons / Ninjacoder)解决方案来集成MvvmCross和Xamarin.Forms时,我遇到了同样的问题。

我能够使用以下内容使其工作,但它似乎是一个黑客。但它确实只解决了在调试输出中注意到的TakePicture 第一次使用的问题:

  

快照未呈现的视图会导致空快照。确保在屏幕更新后快照或快照之前,您的视图至少呈现过一次。

即使第一个返回图像流,任何后续调用都不会返回,并且在第二次调用TakePicture之后将显示

  

mvx:警告:当任务已经激活时调用30,97 MvxImagePickerTask

我的解决方案是:

public virtual bool PresentModalViewController(UIViewController controller, bool animated) {
        _window.RootViewController.PresentViewController(controller, true, null);
}

更新:某种解决方案

在MvvmCross自动在ViewModel IMvxPictureChooserTask中实例化ctor之前。

我通过每次使用TakePicture解析任务来解决后续调用Mvx.Resolve()

在:

private IMvxPictureChooserTask globalTask;

private void Snapshot() {
    var stream = await globalTask.TakePicture(1200, 95);
    // Would only come here on the first attempt
}

public MainViewModel(IMvxPictureChooserTask task) {
    globalTask = task;
}

解决方案:

private void Snapshot() {
    var task = Mvx.Resolve<IMvxPictureChooserTask>();
    var stream = await task.TakePicture(1200, 95);
    // works everytime
}

我有点担心某处有内存泄漏。

答案 1 :(得分:1)

<强>解

只需要在自定义演示者中覆盖PresentModalViewController:

public override bool PresentModalViewController(MonoTouch.UIKit.UIViewController viewController, bool animated)
{
    var currentViewController = _flyOutNavigationController.ViewControllers[_flyOutNavigationController.SelectedIndex] as UINavigationController;
    currentViewController.PresentViewController(viewController, true, null);
    return true;
}