在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;
}
答案 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;
}