После копания в коде и игры с вещами я нашел способ сделать это, который, вероятно, задокументирован везде, где у вас есть фреймворк.
Глядя на iCodeOauthViewController.m, внутри viewDidAppear:
вы можете вызвать isAuthorized
на двигателе, и он скажет вам, если вы аутентифицированы или нет.Если это возвращает да, вы можете затем вызвать метод clearAccessToken
на объекте механизма, чтобы очистить эту аутентификацию.При следующем вызове controllerToEnterCredentialsWithTwitterEngine: delegate:
он вернет контроллер представления для повторного ввода имени пользователя и пароля.
edit: в iCodeOauthViewController.m внутри viewDidAppear: (строка 46) вы увидите эту строку:
UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];
этот вызов возвращает экран входа в систему, который вы видите, если пользователь еще не вошел в систему. Если пользователь вошел в систему, он возвращает ноль.Если контроллер равен нулю, он сразу переходит к списку.
для «выхода» из системы пользователя, вы можете использовать этот метод:
- (void)switchUser
{
// log off the existing user if one is validated
if ([_engine isAuthorized])
[_engine clearAccessToken];
// display the login prompt
UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];
if (controller)
[self presentModalViewController: controller animated: YES];
}
edit 2: похоже, ваша проблема внутритвой метод твита.Вы добавили код предупреждения после попытки отправки твита, и это приведет к сбою, если пользователь не вошел в систему. Вот ваш код:
-(IBAction)tweet:(id)sender {
[textfield resignFirstResponder];
[_engine sendUpdate:[textfield text]];
[self updateStream:nil];
if([_engine isAuthorized]==NO){UIAlertView *alert = [[UIAlertView alloc]
initWithTitle: @"Please, Sign in"
message: @"You'll have to sign in for this app to work!"
delegate: nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
измените его так, чтобы он выглядел следующим образом:
-(IBAction)tweet:(id)sender {
if([_engine isAuthorized]==NO){
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle: @"Please, Sign in"
message: @"You'll have to sign in for this app to work!"
delegate: nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
[alert release];
}
else {
[textfield resignFirstResponder];
[_engine sendUpdate:[textfield text]];
[self updateStream:nil];
}
}
Обратите внимание, что теперь мы проверяем, аутентифицированы ли мы перед тем, как пытаться отправить твит, и если мы не авторизованы, вместо этого выдается предупреждение.Мои извинения, я, возможно, ввел вас в заблуждение, выпуская сигнал тревоги, я неправильно понял, что вы говорите.
Я бы порекомендовал немного больше понять, как работает target-c, и познакомиться с .отладчик .Если вы запустите отладчик, и ваше приложение будет аварийно завершено, отладчик остановится в той точке кода, где происходит сбой, и вы можете просмотреть вызовы функций в стеке, чтобы определить, что код делает неправильно.См. этот вопрос о переполнении стека (в частности ответы) для получения дополнительных ресурсов о том, как лучше начать работу с target-c.Я бы порекомендовал некоторые из онлайн-сайтов, такие как CocoaDevCentral's руководства. Запомните это .Вы хорошо начинаете пытаться сделать что-то свое на основе примера.Не бойтесь создать сторонний проект, чтобы поиграть с идеей, если она не сразу сработает в вашем основном проекте, даже если это что-то столь же простое, как поиск другого способа сделать 2 + 2. Надеюсь, что это поможет.