Заредете изглед от NIB файл от няколко различни UIViewControllers

Успешно зареждах изглед от Nib файлове, използвайки подхода, намерен на този сайт

[[NSBundle mainBundle] loadNibNamed:@"YourNibName" owner:self options:nil];

Проблемът е, че тъй като трябва да зададем собственик на файл, този nib файл се прикачва към този контролер за изглед. Този изглед е подклас на UITableViewCell и исках да заредя този nib файл от няколко различни vc. Благодаря за вашата помощ.


person Paulo Casaretto    schedule 19.08.2010    source източник


Отговори (3)


Ще представя два варианта:

  • Създайте клас NibLoader с един @property (nonatomic, retain) IBOutlet id mainObject; и метод, наречен loadNibNamed:bundle:). След това направете MyView * v = [[NibLoader loadNibNamed:"MyView" bundle:nil] mainObject];. (Грешка в достъпа до свойство на GCC 4.0 означаваше, че [...].mainObject ще извика [...] два пъти; това е поправено в 4.2.)
  • Създайте @protocol MyNibOwner, който има @property (nonatomic, retain) IBOutlet MyView * myView;, и променете класа собственик на файла на id<MyNibLoader> или NSObject<MyNibLoader>.
person tc.    schedule 19.08.2010
comment
или UIViewController<MyNibLoader>, но това спира изгледите да зареждат вашия nib като подизглед в init. - person tc.; 19.08.2010
comment
Второто решение звучи перфектно, но IB не приема протокола след id. Задаването му на id и запазването на счупената препратка работи, но предполагам, че не е много безопасно. - person Paulo Casaretto; 20.08.2010
comment
Това е странно, тъй като IBOutlet id<FooDelegate> delegate работи перфектно (но може би просто игнорира протокола в този случай; няма да ме изненада). Можете да добавите фиктивно @interface MyNibOwnerHack:NSObject<MyNibOwner> в полза на InterfaceBuilder. - person tc.; 20.08.2010
comment
shameless plug: Току-що публикувах хубаво допълнение към този метод, което се оказа много полезно за мен на loudcoding.com/posts/ - person Paulo Casaretto; 30.03.2012
comment

В iOS може да се използва методът startMonitoringForRegion: на CLLocationManager, за да се регистрира делегат, за да отговори на устройството, което се премества в конкретен географски регион, дори когато приложението не е стартирано. От Справка за клас CLLocationManager:

В iOS регионите, които регистрирате в диспечера на местоположението, продължават да съществуват между стартиранията на вашето приложение. Ако възникне пресичане на регион, докато приложението ви за iOS не работи, системата автоматично го събужда (или го стартира отново) във фонов режим, за да може да обработи събитието. При повторно стартиране всички региони, които сте конфигурирали преди това, стават достъпни в свойството monitoredRegions на всички обекти на мениджъра на местоположения, които създавате.

Предполагам, че ако приложението бъде рестартирано, iOS всъщност не го извежда на преден план. Не можах да намеря добри примери, илюстриращи къде startMonitoringForRegion се вписва в цялостно приложение, така че въпросите ми са:

  1. Трябва ли да се регистрира делегатът за startMonitoringForRegion от някъде конкретно? Предполагам, че не може да бъде поставено в контролер за изглед, ако стартираме приложението, без да го извеждаме на преден план. Може ли някой да даде пример с някакъв контекст около него?
  2. Ако решим, че на искаме да поставим приложението на преден план в резултат на влизане в региона, как ще го направим?
  3. Кога startMonitoringForRegion се регистрира в ОС и кога се дерегистрира? Трябва ли потребителят да е стартирал приложението поне веднъж (дори ако след това е било убито), за да се извърши първоначалната регистрация? Какво става, ако потребителят изключи устройството? Ще бъде ли регистриран нашият манипулатор при следващото включване на устройството или потребителят ще трябва да стартира приложението поне още веднъж?
- person tc.; 04.04.2012

Нибът е просто шаблон, можете да го зареждате отново и отново.

Ако използвате iOS4, може да искате да погледнете UINib, който дава подобрена производителност при многократно зареждане на писеца.

person Eiko    schedule 19.08.2010

Педантично, перото вероятно трябва да има един контролер. Това, което вероятно бих направил, е да създам нов UIViewController подклас, който контролира нещата в този ваш nib, и след това всеки път, когато искате нещата в nib, създайте един от тези контролери за изглед и го помолете го за неща, вместо да зареждате директно перото.

person Dave DeLong    schedule 19.08.2010
comment
Уф, не. Вграждането на контролери за изглед в контролери за изглед е неприятно и ако искате просто изгледа, трябва да направите UIView * v = [[vc.view retain] autorelease]; vc.view = nil; return v; или нещата ще се държат странно (забравих каква е грешката или коя версия на ОС). - person tc.; 19.08.2010