Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
неа. Вы не можете этого сделать.
Причина в том, что экземпляр UIImageView
не хранит файл изображения. Он сохраняет отображение экземпляра UIImage
. Когда вы делаете изображение из файла, вы делаете что-то вроде этого:
UIImage *picture = [UIImage imageNamed:@"myFile.png"];
Как только это будет сделано, больше нет ссылки на имя файла. Экземпляр UIImage
содержит данные, независимо от того, где он был получен. Таким образом, UIImageView
не может знать имя файла.
Кроме того, даже если бы вы могли, вы никогда не получите информацию о имени файла из представления. Это нарушает MVC.
Swift 3
blockquote>Сначала установите идентификатор accessibilityIdentifier как imageName
myImageView.image?.accessibilityIdentifier = "add-image"
Затем используйте следующий код.
extension UIImageView { func getFileName() -> String? { // First set accessibilityIdentifier of image before calling. let imgName = self.image?.accessibilityIdentifier return imgName } }
Наконец, способ вызова метода для идентификации
myImageView.getFileName()
Нет, нет, нет ... в общем, все возможно. Это просто заставляет вас чувствовать себя грязным человеком. Если вам это абсолютно необходимо, сделайте следующее:
+imageNamed:(NSString*)imageName
, которая обращается к существующей реализации и использует описанную здесь технику ( Как использовать objc_setAssociatedObject / objc_getAssociatedObject внутри объекта? ), чтобы окончательно связать imageName
с возвращаемым объектом UIImage. imageNamed:
для вашей реализации в таблице поиска метода в среде выполнения Objective-C. Я могу проверить, работает ли это с предостережением, что вы не можете получить имена загружаемых в NIB UIImage , Похоже, что изображения, загруженные из NIB, не создаются никакими стандартными вызовами функций, поэтому для меня это действительно загадка.
Я оставляю реализацию до вас. Кодирующий код, который закручивается во время выполнения Objective-C, - очень плохая идея, поэтому внимательно следите за потребностями вашего проекта и реализуйте это, только если вам нужно.
UIImage
для переопределения метода?
– vrwim
21 March 2015 в 17:33
+imageNamed:(NSString*)imageName { // save file name in new property or whatever [self imageNamed:imageName]; // infinite loop [super imageNamed:imageName]; // super doesn't contain such a method }
– yonivav
30 December 2015 в 11:02
Я имею дело с этой проблемой, я решил ее с помощью шаблона проектирования MVC, я создал класс карты:
@interface Card : NSObject
@property (strong,nonatomic) UIImage* img;
@property (strong,nonatomic) NSString* url;
@end
// затем в UIViewController
в DidLoad
Method to Do:
// init Cards
Card* card10= [[Card alloc]init];
card10.url=@"image.jpg";
card10.img = [UIImage imageNamed:[card10 url]];
// для примера
UIImageView * myImageView = [[UIImageView alloc]initWithImage:card10.img];
[self.view addSubview:myImageView];
// вы можете проверить имя изображения, чтобы вы могли сделать это:
// например
NSString * str = @"image.jpg";
if([str isEqualToString: [card10 url]]){
// your code here
}
Да, вы можете сравнить с помощью таких данных, как ниже код
UITableViewCell *cell = (UITableViewCell*)[self.view viewWithTag:indexPath.row + 100];
UIImage *secondImage = [UIImage imageNamed:@"boxhover.png"];
NSData *imgData1 = UIImagePNGRepresentation(cell.imageView.image);
NSData *imgData2 = UIImagePNGRepresentation(secondImage);
BOOL isCompare = [imgData1 isEqual:imgData2];
if(isCompare)
{
//contain same image
cell.imageView.image = [UIImage imageNamed:@"box.png"];
}
else
{
//does not contain same image
cell.imageView.image = secondImage;
}
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]])
{
}
вы можете использовать метод setAccessibilityIdentifier для любого подкласса UIView
UIImageView *image ;
[image setAccessibilityIdentifier:@"file name"] ;
NSString *file_name = [image accessibilityIdentifier] ;
localize
, который просто проходит через изображения и делает некоторое регулярное выражение на имени изображения (у меня есть очень веские причины чтобы сделать эти изображения реальными изображениями, а не создавать пользовательский UIImage). Мне было интересно, был ли более чистый способ локализации изображений в объективе c .., поскольку все говорят о MVC, а что нет
– abbood
19 August 2014 в 11:59
неа. Невозможно сделать это изначально. Вам придется подклассифицировать UIImageView и добавить свойство imageFileName (которое вы устанавливаете при настройке изображения).
Вы можете использовать функцию объектива c Runtime для сопоставления imagename с UImageView.
Сначала импортируйте #import <objc/runtime.h>
в свой класс
, затем выполните свой код, как показано ниже:
NSString *filename = @"exampleImage";
UIImage *image = [UIImage imagedName:filename];
objc_setAssociatedObject(image, "imageFilename", filename, OBJC_ASSOCIATION_COPY);
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//You can then get the image later:
NSString *filename = objc_getAssociatedObject(imageView, "imageFilename");
Надеюсь, это вам поможет.
[image setAccessibilityIdentifier:@"demoFileName.png"] ;
, а затем вызовите этот метод
– NSNoob
11 July 2016 в 10:20
Ни UIImageView, ни UIImage не сохраняются в имени файла загруженного изображения.
Вы можете либо
1: (как было предложено Kenny Winker выше) подкласса UIImageView иметь файлName свойство или
2: назовите файлы изображений с цифрами (image1.jpg, image2.jpg и т. д.) и пометьте эти изображения соответствующим номером (tag = 1 для image1.jpg, tag = 2 для image2. jpg и т. д.) или
3: Имейте переменную уровня класса (например, NSString * currentFileName), которая обновляется всякий раз, когда вы обновляете образ UIImageView
Код работает в swift3 - писать код внутри метода didFinishPickingMediaWithInfo:
if let referenceUrl = info[UIImagePickerControllerReferenceURL] as?
NSURL {
ALAssetsLibrary().asset(for: referenceUrl as URL!, resultBlock: { asset in
let fileName = asset?.defaultRepresentation().filename()
print(fileName!)
//do whatever with your file name
}, failureBlock: nil)
}
использовать ниже
UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject));
file_name = imageView.accessibilityLabel;
Не существует собственного способа сделать это; однако вы можете легко создать это поведение.
Вы можете подклассы UIImageView
и добавить новую переменную экземпляра:
NSString* imageFileName;
Тогда вы можете переопределить setImage
, первая настройка imageFileName
в имя файла изображения, которое вы устанавливаете, а затем вызывается [super setImage:imageFileName]
. Что-то вроде этого:
-(void) setImage:(NSString*)fileName
{
imageFileName = fileName;
[super setImage:fileName];
}
Просто потому, что это невозможно сделать изначально не означает, что это невозможно:)
Или вы можете использовать идентификатор восстановления, например:
let myImageView = UIImageView()
myImageView.image = UIImage(named: "anyImage")
myImageView.restorationIdentifier = "anyImage" // Same name as image's name!
// Later, in UI Tests:
print(myImageView.restorationIdentifier!) // Prints "anyImage"
В основном в этом решении вы используете идентификатор восстановления для хранения имени изображения, чтобы вы могли использовать его позже в любом месте. Если вы обновите изображение, вы также должны обновить идентификатор восстановления, например:
myImageView.restorationIdentifier = "newImageName"
Надеюсь, это поможет вам, удачи!