Замяна на съдържанието на UIImage(s), заредени от XIB по време на изпълнение

За концепция, която разработвам, трябва да заредя XIB файлове ръчно и чрез използване на swizzling на клас и метод на екземпляр успях да прихвана извиквания към imageCustomNamed, imageCustomWithContentsOfFile и imageCustomWithCGImage за класа UIImage и initCustomWithImage за UIImageView. Това, което искам да открия името на изображението и да го заменя с някакво съдържание, изобразено в движение на мястото на това, зададено в IB по време на проектиране.

например:

когато XIB има UIImageView обект, чието свойство Image е зададено на „About.png“, трябва да прехвана зареждането на това изображение и да го заменя с друго в зависимост от определени условия. Би било добре дори да замените изображението, след като обектът UIImageView е заредил набора от изображения по време на проектиране, но изглежда, че оригиналното име на UIImage, използвано за задаване на съдържанието на UIImageView, не се съхранява никъде.

Не мога да използвам IBOutlets, тъй като не знам предварително съдържанието на XIB файла; това е клас, който трябва да работи на всеки XIB, не само на определен.

Персонализираните методи всъщност се извикват на мястото на тези по подразбиране, но изглежда, че при зареждане на XIb системата използва imageCustomWithCGImage, който приема CGImageRef като аргумент; от него няма начин да разберете произхода (т.е.: името на файла с изображение)

Някаква идея как мога да пресека зареждането на изображения?


person user415080    schedule 09.08.2010    source източник


Отговори (2)


Поне в OS 3 можете да замените initWithCoder: на UIImageNibPlaceholder. Заменете го с нещо подобно:

-(id)hack_UIImageNibPlaceholder_initWithCoder:(NSCoder*)coder
{
  NSString * name = [coder decodeObjectForKey:@"UIResourceName"];
  [self release];
  return [[UIImage imageNamed:name] retain];
}

Не съм сигурен какво се случва, ако заредите nibs от други пакети (напр. рамки).

person tc.    schedule 09.08.2010
comment
Мислех за това, но това е част от личните неща, така че е не, не - person user415080; 10.08.2010
comment
Всичко са лични неща. Няма гаранция, че можете да замените +[UIImage imageNamed:] и да очаквате нещата да продължат да работят при актуализация на ОС. Понякога това е единственият начин. - person tc.; 10.08.2010
comment
Смятате ли, че това няма да премине преглед? замяната на +[UIImage imageNamed:] не би, но това е частен api, въпреки че не замествате никакви методи с префикс за долна черта - person nbransby; 13.03.2013
comment
@nbransby От това, което прочетох онлайн, автоматичното откриване на частен API прави само основен статичен анализ, така че можете да пропуснете нещата, като използвате NSClassFromString()/NSSelectorFromString(). Някои хора добавят допълнително объркване (напр. rot13), но аз бих го избегнал: Apple може да няма нищо против отговорното частно използване на API, но това би преминало границата. Като алтернатива не използвайте писци. - person tc.; 13.03.2013

Може би можете да зададете друго свойство на UIImageView в xib файл и след това да посочите това свойство? Например етикет или етикет...

person kolinko    schedule 13.03.2011