Выбранная фотография из образца галереи разбилась на iOS 10 # 26

#c# #ios #xamarin #xamarin.ios

#c# #iOS #xamarin #xamarin.ios

Вопрос:

Я попытался следовать руководству от Xamarin.ios о том, как выбрать фотографию из галереи в IOS. Ссылка : https://developer.xamarin.com/recipes/ios/media/video_and_photos/choose_a_photo_from_the_gallery /

Тем не менее, при реализации кодов ошибок не было, но в моем симуляторе произошел сбой, когда я попытался нажать кнопку «выбор». Аналогичная проблема с этим сообщением: https://github.com/xamarin/recipes/issues/26

Кто-нибудь может мне помочь, пожалуйста??? Ниже приведен мой код, который взят из Xamarin.

 using System;
using CoreGraphics;
using AssetsLibrary;
using UIKit;
using Foundation;

namespace App1
{
    public partial class ImageViewController : UIViewController
    {

    UIImagePickerController imagePicker;
    UIButton choosePhotoButton;
    UIImageView imageView;

    public ImageViewController(IntPtr handle)
        : base(handle)
    {
    }

    public ImageViewController()
    {

    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        base.ViewDidLoad();
        Title = "Wähle Bild aus:";
        View.BackgroundColor = UIColor.White;

        imageView = new UIImageView(new CGRect(10, 150, 300, 300));
        Add(imageView);

        choosePhotoButton = UIButton.FromType(UIButtonType.RoundedRect);
        choosePhotoButton.Frame = new CGRect(10, 80, 100, 40);
        choosePhotoButton.SetTitle("Picker", UIControlState.Normal);
        choosePhotoButton.TouchUpInside  = (s, e) =>
        {
            imagePicker = new UIImagePickerController();

            imagePicker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
            imagePicker.MediaTypes = UIImagePickerController.AvailableMediaTypes(UIImagePickerControllerSourceType.PhotoLibrary);

            imagePicker.FinishedPickingMedia  = Handle_FinishedPickingMedia;
            imagePicker.Canceled  = Handle_Canceled;

            //NavigationController.PresentModalViewController(imagePicker, true);
            PresentModalViewController(imagePicker, true);

        };

        View.Add(choosePhotoButton);

    }


    private void Handle_Canceled(object sender, EventArgs e)
    {
        imagePicker.DismissModalViewController(true);
    }

    protected void Handle_FinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs e)
    {
        bool isImage = false;
        switch (e.Info[UIImagePickerController.MediaType].ToString())
        {
            case "public.image":
                Console.WriteLine("Image selected");
                isImage = true;
                break;
            case "public.video":
                Console.WriteLine("Video selected");
                break;
        }

        // get common info (shared between images and video)
        NSUrl referenceURL = e.Info[new NSString("UIImagePickerControllerReferenceUrl")] as NSUrl;
        if (referenceURL != null)
            Console.WriteLine("Url:"   referenceURL.ToString());

        // if it was an image, get the other image info
        if (isImage)
        {
            // get the original image
            UIImage originalImage = e.Info[UIImagePickerController.OriginalImage] as UIImage;
            if (originalImage != null)
            {
                // do something with the image
                imageView.Image = originalImage; // display
            }

            UIImage editedImage = e.Info[UIImagePickerController.EditedImage] as UIImage;
            if (editedImage != null)
            {
                // do something with the image
                Console.WriteLine("got the edited image");
                imageView.Image = editedImage;
            }
        }

        // dismiss the picker
        imagePicker.DismissModalViewController(true);
    }
}
}
  

Комментарии:

1. Происходит ли сбой при нажатии на изображение в галерее? Можете ли вы выполнить строку печати, чтобы узнать, в какой строке ошибка?

Ответ №1:

1) Удалите дублирующийся вызов base.ViewDidLoad();

 public override void ViewDidLoad()
{
    base.ViewDidLoad();
    // base.ViewDidLoad();
  

2) Замените PresentModalViewController , поскольку оно устарело в iOS 6:

     //PresentModalViewController(imagePicker, true);
    PresentViewController(imagePicker, true, null);
  

3) Поскольку вы получаете доступ к библиотеке фотографий пользователя, в iOS10 вы должны запросить разрешение, иначе ваше приложение завершит работу с:

 __CRASHING_DUE_TO_PRIVACY_VIOLATION__
  

Добавьте строковую запись в info.plist :

  • Свойство : Privacy - Photo Library Usage Description
  • Значение : This app needs to access your photo library

введите описание изображения здесь

Это приведет к тому, что пользователю будет предложено принять или запретить доступ к вашему приложению

введите описание изображения здесь

Комментарии:

1. Есть ли у вас какие-либо идеи о том, как сделать эту строку в локализации? @SushiHangover

2. @AlancLiu Info.plist локализация: developer.apple.com/library/content/documentation/General /…

3. Я знал об этом, как заставить его работать с раскадровкой в XCode, но я имею в виду, как это сделать с помощью Xamarin Studio? Где-нибудь кнопка нравится в XCode для локализации plist.info ?

4. @AlancLiu Вы создаете InfoPlist.strings файлы в каталогах `Contents /Resources/<language>.lproj, они включены в ваш пакет приложений. Возможно, вы захотите создать проект Xcode, запустите пример Apple, чтобы понять, как применить эту же технику в Xamarin Studio