UIImageView-как получить имя файла назначенного изображения?
можно ли прочитать имя UIImageView's
UIImage
это в настоящее время хранится в UIImageView
?
Я надеялся, что вы могли бы сделать что-то вроде этого, но не понял его.
NSString *currentImageName = [MyIImageView getFileName];
15 ответов:
Неа. Ты не можешь этого сделать.
причина в том, что
UIImageView
экземпляр не хранит файл изображения. Он хранит отображаетсяUIImage
экземпляра. Когда вы делаете изображение из файла, вы делаете что-то вроде этого:UIImage *picture = [UIImage imageNamed:@"myFile.png"];
как только это будет сделано, больше нет никакой ссылки на имя файла. Элемент
UIImage
экземпляр содержит данные, независимо от того, где он получил его. Таким образом,UIImageView
не мог знать имя файла.кроме того, даже если бы вы могли, вы никогда не будет получать информацию о имени файла из представления. Это ломает MVC.
вы можете использовать метод setAccessibilityIdentifier для любого подкласса UIView
UIImageView *image ; [image setAccessibilityIdentifier:@"file name"] ; NSString *file_name = [image accessibilityIdentifier] ;
нет нет нет... вообще такие вещи возможны. Это просто заставит тебя чувствовать себя грязным человеком. Если вы абсолютно должны сделать это:
создайте категорию с собственной реализацией
+imageNamed:(NSString*)imageName
который обращается к существующей реализации и использует метод, указанный здесь (как использовать objc_setAssociatedObject / objc_getAssociatedObject внутри объекта?), чтобы навсегда связатьimageName
с объектами UIImage объект, который возвращается.использовать Метод Swizzling поменять местами предоставленную реализацию
imageNamed:
для вашей реализации в таблице поиска метода среды выполнения Objective-C.доступ к имени, связанному с экземпляром UIImage (с помощью objc_getAssociatedObject) в любое время вы хотите его.
Я могу проверить, что это работает, с оговоркой, что вы не можете получить имена UIImage загружены в перья. Оказывается, что изображения, загруженные из NIBs, не создаются с помощью стандартных вызовов функций, поэтому для меня это действительно загадка.
я оставляю реализацию до вас. Копирование-вставка кода, который привинчивается к среде выполнения Objective-C, - очень плохая идея, поэтому тщательно подумайте о потребностях вашего проекта и реализуйте это только в случае необходимости.
нет родной способ сделать это; однако, вы можете легко создать его самостоятельно.
вы можете подкласс
UIImageView
и добавить новую переменную экземпляра:NSString* imageFileName;
тогда вы можете переопределить
setImage
первый параметрimageFileName
к имени файла изображения, которое вы устанавливаете, а затем вызываете[super setImage:imageFileName]
. Что-то вроде этого:-(void) setImage:(NSString*)fileName { imageFileName = fileName; [super setImage:fileName]; }
просто потому что это не может быть сделано изначально, не значит, что это невозможно :)
Неа. Нет изначально. Вам нужно будет подкласс UIImageView и добавить свойство imageFileName (которое вы устанавливаете при установке изображения).
if ([imageForCheckMark.image isEqual:[UIImage imageNamed:@"crossCheckMark.png"]]||[imageForCheckMark.image isEqual:[UIImage imageNamed:@"checkMark.png"]]) { }
ни UIImageView не UIImage удерживает имя файла загруженного изображения.
вы можете
1: (Как предложил Кенни Винкер выше) подкласс UIImageView, чтобы иметь свойство fileName или
2: назовите файлы изображений с номерами (image1.jpg, image2.jpg и т. д.) и пометить эти изображения соответствующим номером (tag=1 для image1.jpg, tag=2 для image2.jpg etc) или
3: есть переменная уровня класса (например. NSString *currentFileName) который обновляется всякий раз, когда вы обновляете изображение UIImageView
этот код поможет вам:-
- (NSString *)getFileName:(UIImageView *)imgView{ NSString *imgName = [imgView image].accessibilityIdentifier; NSLog(@"%@",imgName); return imgName; }
использовать это как:-
NSString *currentImageName = [self getFileName:MyIImageView];
вы можете использовать функцию objective 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");
надеюсь, что это помогает вам.
да можно сравнить с помощью данных, как показано ниже код
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; }
Swift 3
Сначала установите 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()
или вы можете использовать идентификатор восстановления, например:
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"
Я надеюсь, что это поможет Вам, удачи!
Я имею дело с этой проблемой, я был решен с помощью шаблона дизайна MVC, я создал класс карт:
@interface Card : NSObject @property (strong,nonatomic) UIImage* img; @property (strong,nonatomic) NSString* url; @end
//затем в
UIViewController
наDidLoad
для :// 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 }
использовать ниже
UIImageView *imageView = ((UIImageView *)(barButtonItem.customView.subviews.lastObject)); file_name = imageView.accessibilityLabel;
код работает в 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) }