【问题标题】:Open Twitter Setting from ACAccountStore (iOS 5.1 TWITTER)从 ACAccountStore 打开 Twitter 设置 (iOS 5.1 TWITTER)
【发布时间】:2012-07-04 17:34:24
【问题描述】:

在 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 设置。可能吗 ?或者我必须手动去 ti twitter 设置?

【问题讨论】:

    标签: iphone objective-c ios5 twitter ios5.1


    【解决方案1】:

    这有点棘手,我通过删除*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

    【讨论】:

    • 上述逻辑中如何避免出现键盘
    • @jeeva 我认为键盘没有显示,或者如果它只是通过 (UIView *view in tweetViewController.view.subviews){ } 找到 textview 或 textfield 并使其 resignFirstResponder。
    • 如果您正在寻找适用于 iOS 6.0+ 的东西,答案below 效果很好。
    • 绝招,使用下面的更新版本。不过,这也因一开始就解决了这个问题而受到赞誉。
    • @jeeva 在呈现模态视图控制器之前删除子视图对我有用。
    【解决方案2】:

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

    【讨论】:

    • 这个方法工作正常,但是当我返回我的应用程序时,屏幕上仍然出现黑色阴影。它是未删除将用户发送到设置的警报视图时出现的背景。你有没有采取措施避免这种情况?
    • 嗯,不,我没有这个问题。 [view removeFromSuperview] 调用应该摆脱所有这些。您可以检查视图层次结构以查看仍在显示的内容吗?
    • 黑色阴影也有同样的问题——我猜是呈现的 UIViewController 的剩余部分。通过替换上面的两个事件来解决这个问题 // 用 [self dismissViewControllerAnimated:NO completion:nil]; 做任何你想做的事情;现在它工作正常。
    【解决方案3】:

    根据高级和 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];
    

    【讨论】:

      【解决方案4】:

      要删除帖子视图, 而是使用此代码:

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

      使用这个:

      tweetComposer.view.alpha = 0;
      

      适用于 twitter 和 facebook。

      【讨论】:

        猜你喜欢
        • 2012-04-12
        • 1970-01-01
        • 2013-02-21
        • 2013-07-23
        • 2011-12-12
        • 2014-04-23
        • 2019-09-17
        • 2015-08-27
        • 2016-01-23
        相关资源
        最近更新 更多