2012-07-04 9 views
7

w iOS 5.0 i otwierał ustawienie Twitter z moim app przezOtwarte Twitter Ustawianie z ACAccountStore (iOS 5.1 twitter)

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

ale ten wyposażony jest usuwany w iOS 5.1, stąd nie mogę stanie otwórz ustawienia Twittera.

Teraz używam

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

}]; 

}

dokonywania prośbę, jestem w stanie sprawdzić wether jestem loged lub nie przez

if ([TWTweetComposeViewController canSendTweet])

ale teraz ja chcę: jeśli się nie zaloguję, wyświetli się alert pokazany na obrazku i chcę przejść do ustawień Twittera. Czy to możliwe ? lub muszę ręcznie przejść ustawienia ti twitter? enter image description here

Odpowiedz

17

To jest trochę podstępne, dostaję przez usunięcie subviews w *TWTWeetComposeViewController*, więc pokazuje tylko alert, gdy użytkownik nie jest zalogowany i klikając przycisk ustawienia, możemy otworzyć stronę ustawień w mojej aplikacji.

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

    } 

tutaj, deleate to viewcontroller, jeśli używasz tej metody wewnątrz viewcontroller wystarczy użyć self zamiast delegate.

+1

Jak uniknąć pojawiania się klawiaturą w powyższej logiki – ShivaPrasad

+0

@jeeva myślę klawiatura nie jest wyświetlana lub, jeśli jest to po prostu znaleźć TextView lub pole tekstowe przez (UIView * Zobacz w tweetViewController.view.subviews) { } i uczynić go resignFirstResponder . – PJR

+0

Jeśli szukasz czegoś, co działa w systemie iOS 6.0+, odpowiedź [poniżej] (http://stackoverflow.com/questions/11325266/open-twitter-setting-crom-acaccountstore-ios-5-1-twitter/13293846 # 13293846) działało świetnie. –

8

iOS 6 wykorzystuje SLComposeViewController zamiast TWTweetComposeViewController, więc teraz trzeba to zrobić, jeśli chcesz go do pracy na iOS 6 i 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]; 
+0

ta metoda działa dobrze, ale kiedy wracam do mojej aplikacji, czarny cień wciąż jest na ekranie. Jest to tło, które pojawia się, gdy widok alertu, aby wysłać użytkownika do Ustawień, nie został usunięty. Zrobiłeś coś, aby tego uniknąć? – Aitul

+0

Hmm, nie, nie mam tego problemu. Wywołania [view removeFromSuperview] powinny pozbyć się ich wszystkich. Czy możesz sprawdzić hierarchię widoku, aby zobaczyć, co jest nadal wyświetlane? – Senior

+2

Miałem ten sam problem z czarnym cieniem - pozostałościami UIViewController, który został przedstawiony, zakładam. Rozejrzyj się, zamieniając dwa wystąpienia powyżej // rób co chcesz za pomocą [self dismissViewControllerAnimated: NO complete: nil]; Teraz działa dobrze. – n13

1

Opierając Starszy i PJR męska odpowiedzi powyżej, to co pracował dla mnie.

To samo co Senior, z wyjątkiem dimissViewController w module obsługi zakończenia. Dla mnie rozwiązało to problem polegający na tym, że kontroler pustego widoku pozostanie po powrocie do aplikacji z ustawień. Nadpisałby mój kontroler widoku i uczynił go bezużytecznym.

Doskonałe rozwiązanie, dzięki Senior i 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

Aby usunąć Zobacz post, zamiast przy użyciu tego kodu:

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

użyj:

tweetComposer.view.alpha = 0; 

prace zarówno na Twitterze i Facebooku.