0

我正在使用 oAuth/MGTwitterEngine 为 iphone 开发一个 twitter 应用程序它的源代码在这里:http: //icodeblog.com/wp-content/uploads/2010/09/iCodeOauth.zip

但我希望应用程序的用户能够返回并更改用户名和密码,例如,如果用户拥有多个 Twitter 帐户。

是否可以给按钮一个动作来打开第一次打开应用程序时自动打开的页面。(登录页面)

4

1 回答 1

2

在深入研究代码并玩弄一些东西之后,我找到了一种方法来做到这一点,无论你在哪里获得框架,它都可能记录在案。

查看 iCodeOauthViewController.m,viewDidAppear:你可以isAuthorized在里面调用引擎,它会告诉你是否通过了身份验证。如果返回是,则可以调用clearAccessToken引擎对象上的方法来清除该身份验证。下次调用时controllerToEnterCredentialsWithTwitterEngine: delegate:,它将返回视图控制器以重新输入用户名和密码。

编辑:在 iCodeOauthViewController.m 里面的 fo viewDidAppear: (第 46 行)你会看到这一行:

UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

如果用户尚未登录,此调用将返回您看到的登录屏幕。如果用户已登录,则返回 nil。如果控制器为 nil,则直接跳转到列表。

要“注销”用户,您可以使用此方法:

- (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];
}

编辑 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];

}

}

请注意,我们现在在尝试发送推文之前检查我们是否已通过身份验证,如果我们未获得授权,则改为弹出警报。抱歉,我可能在发布警报时误导了您,我误解了您的意思。

我建议尝试更多地了解objective-c 的工作原理并熟悉调试器。如果您运行调试器并且您的应用程序正在崩溃,则调试器将在代码中崩溃的点停止,您可以查看堆栈中的函数调用以确定代码做错了什么。有关如何更好地开始使用 Objective-c 的更多资源,请参阅此堆栈溢出问题(特别是答案)。我会推荐一些在线站点,例如CocoaDevCentral 的教程。 记住这一点. 您已经有了一个良好的开端,尝试根据示例制作自己的东西。如果一个想法没有立即在你的主项目中发挥作用,不要害怕做一个副项目来玩弄一个想法,即使它就像找出另一种方法来做 2 + 2 一样简单。希望这会有所帮助。

于 2010-12-20T03:37:44.973 回答