#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