Решите в коде, какой класс и файл xib загружать при запуске приложения.

Я меняю свое приложение, чтобы добавить покупку в приложении. Когда я изначально настраивал приложение, я использовал конструктор интерфейса, но теперь мне нужно решить, какой класс и файл xib загружать при запуске приложения в зависимости от того, приобрел ли пользователь функцию.

Мое приложение настроено с помощью контроллера панели вкладок, который имеет контроллер навигации для каждой вкладки. Внутри файла MainWindow.xib я сказал IB использовать класс HomeView.xib и HomeView. Теперь мне нужно проверить, была ли куплена функция, и загрузить HomeView или HomeView2. Я не знаю, где в приложении указать naviagionController, какой класс и представление загружать, поскольку я ранее настроил все это в конструкторе интерфейсов.

Могу ли я принять это решение внутри HomeViewNavigationController вместо того, чтобы IB автоматически принимал это решение за меня?

Заранее спасибо за помощь!


person jmurphy    schedule 18.02.2010    source источник


Ответы (2)


Будь проще.

В HomeView.xib есть два разных представления, которые вы можете загрузить. Пусть представление UIViewController в xib будет «представлением контейнера». Сделайте свой код обнаружения в viewDidLoad вашего контроллера HomeView, а затем добавьте правильный вид в качестве подпредставления.

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (featureWasPaidFor)
    {
        [self.view addSubview:self.homePurchaseView];
    } else {
        [self.view addSubview:self.homeNonPurchaseView];
    }
}
person bstahlhood    schedule 20.02.2010
comment
Однако представление будет иметь другую функциональность. Различные кнопки и действия... Поэтому я подумал, что у меня будет два отдельных класса и xib-файлы. Если featureWasPurchased, создайте homePurchaseView с xib-файлом homePurchaseView. Если я пойду по этому пути, мне нужно будет решить, какой класс загрузить, прежде чем я вызову метод ViewDidLoad внутри класса homePurchaseView. - person jmurphy; 21.02.2010
comment
Вот почему я говорил, что у вас есть основное представление с контейнерным представлением, которое обрабатывает процесс принятия решений и загружает соответствующее представление. Вы все еще можете иметь отдельные классы и XIB, а затем просто инициализировать их в приведенной выше логике. - person bstahlhood; 21.02.2010
comment
Итак, в настоящее время мое приложение загружает представление вкладок, которое было настроено внутри IB с использованием MainWindow.xib. Когда приложение запускается, открывается первая вкладка с представлением HomeView.xib. В каком классе живет описанный выше метод viewDidLoad? Это относится к методу viewDidLoad в моем текущем файле HomeView.m? Итак, в основном сохраняйте ту же настройку, что и сейчас, и создайте два моих отдельных класса, homePurchaseView и homeNonPurchaseView, и добавьте их в метод viewDidLoad моего текущего метода homeView viewDidLoad? Спасибо! - person jmurphy; 21.02.2010
comment
Ага. Таким образом, вы можете сохранить текущую настройку и по-прежнему выполнять то, что хотите, без особых структурных изменений. Пожалуйста! - person bstahlhood; 21.02.2010

Вы устанавливаете xib, который хотите загрузить, в свой Info.plist. Во время запуска система автоматически загрузит этот xib. Хотя легко изменить имя xib в файле Info.plist, оно будет отклонено Apple.

Вот что я бы сделал: не используйте xibs, по крайней мере, для двух, которые вы упомянули. Вместо этого создайте все в applicationDidFinishLaunching:(NSNotification *)notification

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
   UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

   UITabBarController *t = [[UITabBarController alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)];
   // add the other view controllers

   if(/* check for which xib to load */)
   {
      // change whatever you need to change
   }
   else
   {
      // ...
   }

   [window addSubview:[t view]];
   [window makeKeyAndVisible];
}
person Community    schedule 18.02.2010