2011-12-24 3 views
1

Я начал свой проект обратно в xcode 3 как «приложение с вкладками», чтобы настроить панель вкладок в Interface Builder.Как изменить проект xcode с панели с вкладками на простой?

Теперь у меня есть веские основания для создания окна панели вкладок программно.

Я прочитал много вещей и сумел создать новый проект с кодированной панелью вкладок, и все это прекрасно работает. Поэтому я считаю, что я понял, как создать проект панели вкладок с нуля на основе нового «Пустого приложения» (я думаю, что это называлось «оконным приложением» в xcode 3).

Однако, когда я пытаюсь принять этот код в свой текущий проект, который был запущен как «приложение с вкладками», я всегда получаю: «Ожидается, что приложения будут иметь корневой контроллер в конце запуска приложения» на отладочном консоль.

Что мне нужно сделать, чтобы изменить тип моего проекта из «приложения с вкладками» в «пустое приложение» ретроспективно? Или это единственный способ начать новый проект с нуля и скопировать все исходные файлы из старого?

КСТАТИ: прибегая к помощи сообщению об ошибке приводит меня к этой превосходной Теме: Applications are expected to have a root view controller at the end of application launch

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

Edit: меня попросили предоставить код didFinshWithLaunching:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent]; 


#ifdef FREE 

    window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

    self.tabBarController = [[[FcTabBarController alloc] init] autorelease]; 

    VotingMenuTVC *vc0 =[[[VotingMenuTVC alloc] initWithNibName:@"VotingMenuTVC" bundle:nil] autorelease]; 
    ChannelsTVC *vc1 =[[[ChannelsTVC alloc] initWithNibName:@"ChannelsTVC" bundle:nil] autorelease]; 

    NSArray* controllers = [NSArray arrayWithObjects:vc0, vc1, nil]; 
    tabBarController.viewControllers = controllers; 


    // Add the tab bar controller's current view as a subview of the window 
    float ver = [[[UIDevice currentDevice] systemVersion] floatValue]; 
    if (ver >= 4.0) { 
     self.window.rootViewController = self.tabBarController; 
    } else { 
     [window addSubview:[tabBarController view]]; 
    } 

    [window addSubview:[tabBarController view]]; 
    NSLog(@"RootViewController: %@",self.window.rootViewController); 
    NSLog(@"TabBarController: %@",self.tabBarController); 


#else 

    float ver = [[[UIDevice currentDevice] systemVersion] floatValue]; 
    if (ver >= 4.0) { 
     self.window.rootViewController = self.tabBarController; 
    } else { 
      [window addSubview:[tabBarController view]]; 
    } 

#endif 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

для текущей целевой компилятор макрос "FREE" был установлен. В противном случае он будет скомпилирован для другого таргетинга, для которого MainWindow.xib все еще существует (и работает отлично). В настоящее время MainWindow.xib все еще является частью Boundle, даже той, для которой установлен FREE. Но он не задан как основной интерфейс в файле plist для цели. Основной интерфейс пуст.

В соответствии с инструкциями NSLog (и анализом отладки) свойство toolBarController прекрасно, но rootViewController для окон равен нулю, чего я не понимаю.

Как возник вопрос от Фироза Лаффера, спрашивающего, что MainWindow.xib все еще существует, это то, что я изменил. Я обновлю это сообщение позже, опираясь на результат.

+0

У вас есть наконечник MainWindow? Есть ли контроллер окна и панели вкладок? Что делает ваше приложение: didFinishLaunchingWithOptions: похоже? –

ответ

0

Ответ: Я не знаю. В настройках проекта или plist или что-то еще было что-то не так.

Наконец я съел его и начал новый проект с нуля. (Пожертвовав таким образом, я воспользовался возможностью идентифицировать другие кусочки, которые я нашел не так, и я поменялся на ARC этим шансом.)

Итак, я скопировал все источники: * .h, * .m, * .xib, * .png, но нет plist и т. д.(У меня еще нет локализованных строк, но если бы у меня было, то я тоже их скопировал) Но я не копировал MainWindow.xib, который я вообще удалил из исходного проекта.

Наконец метод didFinishLanuchingWithOptions не удивительно, на всех:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent]; 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    FcTabBarController *localTabBarConroller = [[FcTabBarController alloc] init]; 
    self.tabBarController = localTabBarConroller; 

    NSArray* controllers; 

    UserCentralVC *vc1 =[[UserCentralVC alloc] initWithNibName:@"UserCentralVC" bundle:nil user:nil userId:nil]; 
    ChannelsTVC *vc0 =[[ChannelsTVC alloc] initWithNibName:@"ChannelsTVC" bundle:nil] ; 
    AppMenuTVC *vc3  =[[AppMenuTVC alloc] initWithNibName:@"VotingMenuTVC" bundle:nil] ; //Re-Use another similar nib file. 

    UINavigationController* vnc0 = [[UINavigationController alloc] initWithRootViewController:vc0]; 
    UINavigationController* vnc1 = [[UINavigationController alloc] initWithRootViewController:vc1]; 
    UINavigationController* vnc3 = [[UINavigationController alloc] initWithRootViewController:vc3]; 

#ifdef FREE 
    controllers = [NSArray arrayWithObjects:vnc0, vnc1, vnc3, nil]; 
#else 
    VotingMenuTVC *vc2 =[[VotingMenuTVC alloc] initWithNibName:@"VotingMenuTVC" bundle:nil] ; 
    UINavigationController* vnc2 = [[UINavigationController alloc] initWithRootViewController:vc2]; 
    controllers = [NSArray arrayWithObjects:vnc0, vnc1, vnc2, vnc3, nil]; 
#endif 

    self.tabBarController.viewControllers = controllers; 


    // Add the tab bar controller's current view as a subview of the window 
    float ver = [[[UIDevice currentDevice] systemVersion] floatValue]; 
    if (ver >= 4.0) { 
     self.window.rootViewController = self.tabBarController; 
    } else { 
     [self.window addSubview:[self.tabBarController view]]; 
    } 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

Спасибо всем, кто помог. Иногда бывает полезно поговорить, даже если решение прямо не представлено на серебряной пластине :)

Сезонные поздравления всем вам!

2

Не нужно начинать с нуля. Если вы создаете свой UITabBarController в своем делете приложения, вам нужно убедиться, что вы установили его как контроллер корневого представления вашего окна. Поскольку UITabBarController является подклассом UIViewController, вы можете сделать это довольно легко!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

    // Start creating your UITabBarController and set it up here: 
    UITabBarController *tabBarController; 
    // Finish creating your UITabBarController here 

    self.window.rootViewController = tabBarController; 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

Это, вероятно, лучше, чтобы сделать tabBarController свойство тоже.

+0

Спасибо. Это не так. Я добавлю код didFinishWithLaunching к вопросу. –

+1

Нет, это он. Настройка свойства контроллера корневого представления теперь является предпочтительным способом размещения на экране контроллера начального представления. Добавление subview в окно SO 2010. –

+0

Я согласен с @MarkAdams. Добавление подзаголовка и автореклассирование - это, в любом случае, ленивое управление памятью. –

Смежные вопросы