2012-02-16 3 views
0

У меня есть приложение, использующее контроллер табуляции. Однако прежде чем я хочу, чтобы контроллер табуляции загружался, я хочу, чтобы пользователь ввел экран, который позволяет им сначала ввести свой номер телефона, поскольку мне нужно сохранить номер телефона пользователя для использования в приложении. Я сохраняю номер в приложении, как это.iPhone refresh AppDelegate

[[NSUserDefaults standardUserDefaults] setInteger:1234 forKey:@"PhoneNumber"]; 

В основном, когда они сначала введите приложение, откроется окно, которое позволит им сохранить ввести номер в текстовом поле и сохраняются с помощью NSUserDefaults.

В AppDelegate, у меня есть, если заявление, чтобы проверить, если значение хранится или не нравится этот

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    NSInteger phoneNumber=[[NSUserDefaults standardUserDefaults] integerForKey:@"PhoneNumber"]; 

    if(phoneNumber == 0){ 
     //So this is the window which allow them to enter their phone number 
     UIViewController *phoneNumberVC = [[PhoneNumberVC alloc] initWithNibName:@"PhoneNumber" bundle:nil]; 
     UIViewController *phoneNumberRootVC = [[UINavigationController alloc] initWithRootViewController:phoneNumberVC]; 
     self.window.rootViewController = phoneNumberRootVC;  
     [self.window makeKeyAndVisible];  
    }else{ 
     //Code here sets up tab controller and all the tabs etc 
    } 
} 

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

-(IBAction)testing{ 
    NSString *st = [phoneTF text]; 
    NSInteger pn = [st intValue]; 
    NSString *display = [NSString stringWithFormat:@"%i", pn]; 
    [[NSUserDefaults standardUserDefaults] setInteger:pn forKey:@"PhoneNumber"]; 
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Warning" 
                message:display 
                delegate:self 
              cancelButtonTitle:@"Okay" 
              otherButtonTitles:nil]; 
    [alert show]; 
} 

Предупреждение предназначено только для тестирования. Поэтому после нажатия кнопки я хочу, чтобы контроллер табуляции загружался в делегат приложения. В любом случае я могу обновить приложение или делегат приложения?

Был бы очень признателен, если бы кто-то мог указать мне в правильном направлении !!!

EDIT

Пробовал

[self.navigationController pushViewController:app.tabBarController animated:YES]; 

Но как tabBarController еще не инициализирован, он не будет работать

Консоль ошибок

Application tried to push a nil view controller on target <UINavigationController: 0x8056d40>. 

Так что мне нужно, чтобы запустить AppDelegate снова, так что контроллер табуляции и все его представления будут инициализированы

ответ

1

заменить

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Warning" message:display 
              delegate:self cancelButtonTitle:@"Okay" otherButtonTitles: nil]; 
[alert show]; 

с кодом, который задает контроллер навигации, чтобы переключиться на другой точки зрения вы хотите:

YourOtherViewController *yourOtherViewController = [[YourOtherViewController alloc] init]; 
[self.navigationController pushViewController:yourOtherViewController animated:YES]; 

Edit

Если вы хотите получить доступ к AppDelegate из phoneNumberVC, вы можете сделать примерно следующее:

if(phoneNumber == 0){ 
    UIViewController *phoneNumberVC = [[PhoneNumberVC alloc] initWithNibName:@"PhoneNumber" bundle:nil]; 
    phoneNumberVC.appDelegate = self; // add this property to PhoneNumberVC 
    UIViewController *phoneNumberRootVC = [[UINavigationController alloc] initWithRootViewController:phoneNumberVC]; 
    self.window.rootViewController = phoneNumberRootVC; 
} else { 
    [self setUpTabViewController]; // add this function 
} 
[self.window makeKeyAndVisible]; 

И в PhoneNumberVC что-то вроде:

[self.appDelegate setUpTabViewController]; 
+0

Этот код является штраф, если вы просто хотите, чтобы открыть новый XIB, но мне нужно, чтобы открыть вкладку контроллера. Контроллер табуляции и все экраны вкладок настроены в AppDelegate, а не в PhoneNumberVC. Поэтому моя проблема заключается в том, как мне снова получить доступ к AppDelegate и запустить код оттуда. Экран номера телефона не является частью контроллера табуляции, это просто нормальный вид – AdamM

+0

См. Мой обновленный ответ. Работает ли это для вас? – sch

+0

К сожалению, нет. Вы оператор if в делегате приложения означает, что контроллер табуляции никогда не инициализируется до тех пор, пока пользователь не сохранит их номер на экране телефонного номера. После этого мне нужно снова запустить код делегирования приложения, чтобы был настроен контроллер навигации на вкладке. Посмотрите на мое редактирование, чтобы увидеть, что я пробовал. – AdamM