从ACAccountStore打开Twitter设置(iOS 5.1 TWITTER)

7

在iOS 5.0中,我通过以下方式从我的应用程序打开Twitter设置:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=TWITTER"]];

但是,在iOS 5.1中,这个功能已经被移除了,因此我无法打开Twitter设置。

现在我正在使用

 + (void)makeRequestsWithURL: (NSURL *)url {
// Create an account store object.
ACAccountStore *accountStore = [[ACAccountStore alloc] init];

// Create an account type that ensures Twitter accounts are retrieved.
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
[self canTweetStatus];

// Request access from the user to use their Twitter accounts.
[accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
    if(granted) {
        // Get the list of Twitter accounts.
        NSArray *accountsArray = [accountStore accountsWithAccountType:accountType];

        // For the sake of brevity, we'll assume there is only one Twitter account present.
        // You would ideally ask the user which account they want to tweet from, if there is more than one Twitter account present.
        if ([accountsArray count] > 0) {
            // Grab the initial Twitter account to tweet from.
            ACAccount *twitterAccount = [accountsArray objectAtIndex:0];


            // Create a request, which in this example, posts a tweet to the user's timeline.
            // This example uses version 1 of the Twitter API.
            // This may need to be changed to whichever version is currently appropriate.
            TWRequest *postRequest = [[TWRequest alloc] initWithURL:url parameters:nil requestMethod:TWRequestMethodPOST];

            // Set the account used to post the tweet.
            [postRequest setAccount:twitterAccount];

            // Perform the request created above and create a handler block to handle the response.
            [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
                NSString *output = [NSString stringWithFormat:@"HTTP response status: %i", [urlResponse statusCode]];
                iOS5Twitter *twitter5 = [[iOS5Twitter alloc] init];
                [twitter5 performSelectorOnMainThread:@selector(displayText:) withObject:output waitUntilDone:NO];
                [twitter5 release];                }];
        }
    }

}];

对于发起请求,我可以通过以下代码检查是否已登录:

if ([TWTweetComposeViewController canSendTweet])

但现在我想要:如果我没有登录,则应该像图片中所示一样显示一个提示,并希望移动到 Twitter 设置。这是否可能?还是我必须手动进入 Twitter 设置?enter image description here

4个回答

17

这有点棘手,我是通过在*TWTWeetComposeViewController*中删除子视图来实现的,因此只有在用户未登录时才显示警报,并且通过点击设置按钮,我们可以在我的应用中打开设置页面。

     + (void)setAlertForSettingPage :(id)delegate 
    {
     // Set up the built-in twitter composition view controller.
        TWTweetComposeViewController *tweetViewController = [[TWTweetComposeViewController alloc] init];


        // Create the completion handler block.
        [tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) {
            [delegate dismissModalViewControllerAnimated:YES];
        }];

        // Present the tweet composition view controller modally.
        [delegate presentModalViewController:tweetViewController animated:YES];
        //tweetViewController.view.hidden = YES;
        for (UIView *view in tweetViewController.view.subviews){
            [view removeFromSuperview];
        }

     } 

在这里,“deleate”指的是你的视图控制器,如果你在视图控制器内部使用这个方法,只需使用self替换delegate即可。


1
如何避免在上述逻辑中弹出键盘 - ShivaPrasad
@jeeva 我认为键盘没有显示,或者如果它显示了,只需通过 (UIView *view in tweetViewController.view.subviews) 查找 TextView 或 TextField,然后使其 resignFirstResponder。 - PJR
如果您正在寻找适用于iOS 6.0+的解决方案,下面的答案(链接:https://dev59.com/sGXWa4cB1Zd3GeqPPrda#13293846)非常有效。 - Reid Main
很棒的技巧,使用下面的更新版本。虽然这也因为首先想到了解决方法而得到了认可。 - n13
@jeeva 在呈现模态视图控制器之前删除子视图对我有效。 - Nick

8

iOS 6使用SLComposeViewController代替TWTweetComposeViewController,所以如果您想在iOS 6和iOS 5上使其正常工作,现在必须这样做:

    UIViewController *tweetComposer;

    if([SLComposeViewController class] != nil)
    {
        tweetComposer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];

        [(SLComposeViewController *)tweetComposer setCompletionHandler:^(SLComposeViewControllerResult result)
         {
            // do whatever you want
         }];
    }
    else
    {
        tweetComposer = [[TWTweetComposeViewController alloc] init];

        [(TWTweetComposeViewController *)tweetComposer setCompletionHandler:^(TWTweetComposeViewControllerResult result)
         {
            // do whatever you want
         }];
    }

    for (UIView *view in [[tweetComposer view] subviews])
        [view removeFromSuperview];

    [self presentViewController:tweetComposer animated:NO completion:nil];

这个方法运行良好,但当我返回到我的应用程序时,屏幕上仍然有一个黑色阴影。这是当警报视图提示用户转到设置时出现的背景未被移除。你有做什么来避免这种情况吗? - Aitul
嗯,不,我没有遇到这个问题。[view removeFromSuperview]调用应该会清除所有的视图。你能检查一下视图层次结构,看看还有什么正在显示吗? - Senior
2
有一个关于黑影的相同问题 - 我想是被呈现的UIViewController的残留。通过替换上面两个位置的 // do whatever you want with [self dismissViewControllerAnimated:NO completion:nil]; 绕过了这个问题,现在它可以正常工作了。 - n13

1

在Senior和PJR上面的回答的基础上,以下是对我有用的方法。

与Senior相同,只是在完成处理程序中使用了dimissViewController。这样可以解决空视图控制器会在我从设置返回应用程序后继续存在的问题。它会覆盖我的视图控制器并使其无用。

非常棒的解决方案,感谢Senior和PJR。

UIViewController *tweetComposer;

if([SLComposeViewController class] != nil)
{
    tweetComposer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];

    [(SLComposeViewController *)tweetComposer setCompletionHandler:^(SLComposeViewControllerResult result)
     {
            [self dismissViewControllerAnimated:NO completion:nil];
     }];
}
else
{
    tweetComposer = [[TWTweetComposeViewController alloc] init];

    [(TWTweetComposeViewController *)tweetComposer setCompletionHandler:^(TWTweetComposeViewControllerResult result)
     {
           [self dismissViewControllerAnimated:NO completion:nil];

     }];
}

for (UIView *view in [[tweetComposer view] subviews])
    [view removeFromSuperview];

[self presentViewController:tweetComposer animated:NO completion:nil];

0

为了移除帖子视图,可以使用以下代码:

for (UIView *view in [[tweetComposer view] subviews])
    [view removeFromSuperview];

使用这个:

tweetComposer.view.alpha = 0;

适用于 Twitter 和 Facebook。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接