Как nib файлът познава своя контролер на собственика на файла

Когато се създаде UIViewController и съответния nib файл, този nib файл обикновено идва със същото име като контролера, но може да бъде преименуван. И така, как IB знае за кой UIViewController се отнася този nib файл?

Когато човек плъзга от референтен изход или от действие, IB показва само методите за конкретен контролер. Как се избира? Когато някой преименува перото, се чудя дали IB запазва връзката между перото и UIViewController.

Изглежда, че има твърде много объркване в главата ми? :) Надявам се, че не...

Поздрави, Фак


person Fakada    schedule 15.04.2011    source източник
comment
Cocoa: Какво е собственикът на файл в nib? има добро обяснение.   -  person Black Frog    schedule 15.04.2011


Отговори (3)


Не е задължително nib файлът да знае кой конкретен подклас на UIViewController е собственикът на неговия файл. Обърнете внимание, че зареждането на перото, притежавано от контролера на изгледа, (обикновено) се извършва в две стъпки:

  1. Инстанциран е екземпляр на (подклас на) UIViewController
  2. Този екземпляр получава -initWithNibName:bundle:, като по този начин е наясно с nib файла, който трябва да зареди, след което екземплярът става собственик на nib файла.

Така че екземплярът UIViewController (или негов подклас) трябва да знае името на nib файла, но обратното не е непременно вярно.

Въпреки това, подклас от UIViewController обикновено дефинира изходи към обекти в nib файла и получава действия. За да могат изходите и действията да бъдат свързани в Xcode/Interface Builder, вие задавате класа собственик на файла в инспектора на самоличността на съответния подклас на UIViewController.

person Community    schedule 15.04.2011

Ако отворите IB и проверите за класа на собственика на файла в четвъртия раздел в прозореца на инспектора, тогава тук можете да видите името на класа.  въведете описание на изображението тук

person saadnib    schedule 15.04.2011
comment
@saadnib, бих казал, че това е името на класа. - person Black Frog; 15.04.2011
comment
здравей, използвам xcode 4... къде е това? може ли да качите екранна снимка, защото не я виждам :( МИСЛЯ, ЧЕ СЪМ СЛЯП :) - person Fakada; 15.04.2011
comment
съжалявам, нямам представа за xcode4, но ако искате, мога да ви дам екранна снимка на xCode 3.2.5 - person saadnib; 15.04.2011

Знам, че това е стар въпрос. Просто споделям моето разбиране тук.

Да кажем, че създаваме подклас на UIViewController в XCode и го наименуваме като SecondViewController, чието xib име на файл ще бъде SecondViewController.xib по подразбиране. Тогава нека първо да видим как да създадем този VC и след това да обсъдим кой е собственикът на файла.

  1. Създайте и покажете SecondViewController с име на nib: нека създадем VC, използвайки initWithNibName:bundle: с указаното име на xib, кодът може да бъде като този:

    SecondViewController * vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self presentViewController:vc animated:YES completion:nil];
    
  2. Създаване и показване на SecondViewController без име на перо: ако всичко е по подразбиране, това означава, че VC има същото име на клас като името на файла xib, тогава можем да игнорираме името на перото, кодовете, създаващи vc, могат да бъдат така:

    SecondViewController * vc = [[SecondViewtController alloc] init];
    [self presentViewController:vc animated:YES completion:nil];
    
  3. Създайте и покажете SecondViewController с различно име на xib файл: ако преименувате името на xib файла, тогава трябва да посочите името на xib файла, когато създавате VC, кодовете могат да бъдат като тези:

    SecondViewController * vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController2" bundle:nil];
    [self presentViewController:vc animated:YES completion:nil];
    
  4. Какво е собственикът на файла? Първо, както казаха от Apple, това е обект-заместител. Този обект е контейнер на обектите, дефинирани във файла xib. Освен това този обект може да получава съобщенията, изпратени от обектите в xib, например съобщение за щракване на бутон. Когато създавате изход или действие, тяхната цел ще бъде собственикът на файла, но този обект е неизвестен по време на проектиране. В конструктора на интерфейси се показва така: Собственикът на файла като цел на действието

  5. Какво е собственикът на файла? Второ, това е име на клас, показано в създателя на интерфейса. Екземплярът на този клас съдържа обектите, дефинирани в xib. Показва се така: въведете описание на изображението тук

  6. Какво ще стане, ако не задам името на класа за собственика на файла? В този случай IB няма да ви позволи да създадете изход или действие чрез контролно плъзгане, защото не знае кой ще съдържа изхода или действието.

  7. Какво ще стане, ако премахна името на класа за собственика на файла, след като създам изхода или действието? Добре е да премахнете името на класа в IB. Създаването на кодове ще работи както преди.

  8. Нека се върнем към въпроса: „Как един nib файл знае, че контролерът на собственика на неговия файл е“?

    • In design time, IB knows the Owner controller only after setting the File's Owner's class name;
    • Във времето за изпълнение, времето за изпълнение задава обекта, който получава init или initWithNibName: пакет: като обект Собственик на файл на писалката.
person Jeff.Lu    schedule 22.04.2016