2009-07-14 3 views
0

Я работаю над приложением iPhone. Когда приложение запускается, я проверяю подлинность, устанавливаю соединение Restful, получаю данные в виде XML-файла, разбираю его и затем показываю в виде табличного представления. Вот моя проблема. Если информация пользователя уже сохранена в приложении или жестко закодирована в коде, приложение принимает имя пользователя и пароль для аутентификации и переходит к отображению данных в формате таблицы. Я до сих пор тестировал жестко кодированные данные. Теперь я хочу отобразить другое представление, которое запрашивает имя пользователя и пароль, если оно не присутствует в приложении ..i.e. Я хочу, чтобы имя пользователя и пароль были динамическими, а не статическими. В моем случае, когда использование занято, вводя имя пользователя и пароль, метод «viewDidLoad» пытается установить соединение с сервером с пустым именем пользователя и паролем, которые не могут быть связаны с подключением к серверу и загрузкой таблицы. Но если я запустил приложение во второй раз, приложение найдет имя пользователя и пароль, введенные ранее, и прекрасно загрузит таблицы.Как отложить метод?

Есть ли способ задержать процесс подключения к серверу, если приложение не находит имя пользователя и пароль? Как я могу сигнализировать метод подключения к серверу после того, как пользователь ввел имя пользователя и пароль?

Благодарим за помощь.

ответ

1

Можете ли вы опубликовать часть своего кода? Трудно спекулировать, не видя, что происходит, но я все равно попробую.

Вам нужно переместить код, в котором вы подключаетесь к серверу вне видимостиDidLoad, и поместить его в метод обратного вызова или что-то в этом роде. Я предлагаю бросить предупреждение с полем имени и пароля, сделать ваш диспетчер представлений делегатом оповещения, а затем подключить функцию clickedButtonAtIndex к серверу.

Пример:

-(void)viewDidLoad { 
    UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"Please enter your username and password below" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login",nil]; 

    //You might have to do some fiddling with the frame sizes to make it fit in the alert. 
    UITextField *userNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)]; 
    userNameField.placeholder = @"User Name"; 
    [loginAlert addSubview:userNameField]; 
    //loginAlert will retain this so we release it now. 
    [userNameField release]; 



    [UITextField *passwordNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)]; 
    passwordNameField.secureTextEntry = YES; 
    [loginAlert addSubview:passwordNameField]; 
    [passwordNameField release] 

    //This line tells the iPhone to stretch out your AlertView so it's big enough for your two textViews, we use 0 and 130 respectively but we only have one text field. 
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(stretchX, stretchY); 

    [loginAlert setTransform:myTransform]; 
    [loginAlert show]; 
    [loginAlert release]; 
} 


//Implement this method, it will be called when the user clicks the "login" button on your alert. 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    //Usually if they click cancel you do nothing, thats buttonIndex 0 
     if(buttonIndex == 1) { 
     //Connect to the server with the correct login and password. 
    } 
} 
+0

Привет Тим, спасибо за ваше предложение , При вводе имени пользователя и пароля с помощью предупреждения была решена моя проблема. Я вводил имя пользователя и пароль во втором представлении, поэтому у меня возникла проблема перезагрузки представлений таблиц в корневом представлении, когда во втором представлении была нажата кнопка «Логин». Мое корневое представление сложное, так как оно включает в себя контроллер табуляции, контроллер навигации, представление таблицы и 3-сегментный сегментированный элемент управления. Таким образом, мне трудно было обновить таблицы корневого представления, когда в подзаголовок была нажата кнопка входа в систему. Спасибо за ваше предложение, теперь он отлично работает. – 2009-07-14 23:21:54

+0

Рад помочь! –

+0

Я уверен, что добавление UITextField в UIAlert против HIG от Apple. Если вы планируете отправить это программное обеспечение в App Store, возможно, вам будет проще отображать модальный вид вместо UIAlert (используя -presentModalViewController: анимированный :). – leolobato

0

После того, как вы отобразите представление в окне ViewDidLoad, вызывается ВСЕГДА, поэтому его вызываемый viewDidLoad ... Что вам нужно сделать, это создать противоположное представление для шагов входа в систему, а затем, когда пользователь выполнил вход в систему они нажмут кнопку входа в систему, которая будет вызывать представление, которое подключается к вашему спокойному сервису. Если пользовательские данные уже присутствуют, пропустите страницу входа в систему и перейдите прямо к виду вашего стола.

+0

Вы можете конечно не весь код, который делает загрузку таблицы в viewDidLoad, вместо того, чтобы иметь еще один метод, который вызывается, когда вам это нужно, чтобы быть – Daniel