Проблема с кнопкой «Отмена» в iOS6

Я нахожусь в процессе изменения своего приложения для iOS6 и iPhone, я не могу понять, почему, когда я публикую сообщения из Твиттера с помощью новой социальной среды, мне приходится дважды нажимать «Отмена», чтобы закрыть, у кого-то еще есть это проблема или исправление? Вот код кнопки.

- (IBAction)twitterPost:(id)sender
{
if([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
{
    mySLComposerSheet = [[SLComposeViewController alloc] init];
    mySLComposerSheet = [SLComposeViewController   composeViewControllerForServiceType:SLServiceTypeTwitter];
    [mySLComposerSheet setInitialText:[NSString stringWithFormat:@"This is my tweet, hello!",mySLComposerSheet.serviceType]];
    [self presentViewController:mySLComposerSheet animated:YES completion:nil];
}
[mySLComposerSheet setCompletionHandler:^(SLComposeViewControllerResult result) {
    NSLog(@"dfsdf");
    switch (result) {
        case SLComposeViewControllerResultCancelled:
            break;
        case SLComposeViewControllerResultDone:
            break;
        default:
            break;
    }
}];


}

person Nathan Cleary    schedule 27.09.2012    source источник
comment
Вы пытались установить завершение обработчика перед представлением контроллера представления?   -  person Alejandro Benito-Santos    schedule 27.09.2012
comment
Это сделало работу, спасибо Алекс.   -  person Nathan Cleary    schedule 27.09.2012
comment
Хороший, я разместил комментарий как ответ (см. Ниже). Ваше здоровье!   -  person Alejandro Benito-Santos    schedule 27.09.2012


Ответы (5)


Если вы используете mySLComposerSheet, это прекрасно работает...

[mySLComposerSheet setCompletionHandler:^(SLComposeViewControllerResult result) {
[mySLComposerSheet dismissViewControllerAnimated:YES completion:nil];
person Nathan Cleary    schedule 29.09.2012
comment
И тогда вам нужно помнить, что НЕ нужно делать это для Facebook SLComposeViewController, который автоматически закрывает себя! рдар:12440972 - person Steven Kramer; 05.10.2012
comment
Да, забыл упомянуть об этом. - person Nathan Cleary; 06.10.2012
comment
@Стивен, можешь проверить, исправила ли Apple это на сегодняшний день? Совсем недавно починили много рдаров... - person Klaas; 23.06.2013
comment
Я пытался проверить, но пока безуспешно из-за другой проблемы. - person Steven Kramer; 24.06.2013
comment
Исправлено в последнем выпуске SDK. - person Steven Kramer; 26.06.2013
comment
Вы не можете использовать mySLComposerSheet, так как это происходит внутри блочного кода. используйте self вместо mySLComposerSheet. ТС, спасибо за подсказку :) - person Prasad De Zoysa; 09.08.2013
comment
Отвечая на вопрос @Klaas, эта проблема все еще существует для Twitter по состоянию на октябрь 2013 г. с iOS 7 SDK. - person CodeBrew; 22.10.2013
comment
Это необходимо как в ResultCancelled, так и в ResultDone для Twitter, но не для Facebook. - person RanLearns; 08.12.2013

Мой опыт работы с SLComposeViewController заключается в том, что контроллеры Twitter и Weibo нужно отключать вручную, в то время как контроллер facebook ведет себя лучше.

Если я сам не отклоню ViewControllerAnimated, нажатие кнопки «Отправить» отправит твит или публикацию в Weibo, но я останусь с тем, что кажется невидимым представлением поверх моего собственного представления. Таким образом, я больше не могу взаимодействовать со своим приложением.

Я не знаю, почему мое приложение работает именно так... Интересно, что завершениеHandler для отмены вызывается только один раз. Второе касание закрывает контроллер представления.

+ (void) shareText:(NSString*)text image:(UIImage*)image social:(NSString*)service url:(NSString*)url
{
    SLComposeViewController*    controller = [SLComposeViewController composeViewControllerForServiceType:service];

    [controller setInitialText:text];
    [controller addImage:image];
    [controller addURL:[NSURL URLWithString:url]];

    controller.completionHandler = ^(SLComposeViewControllerResult result) {
        if( SLComposeViewControllerResultDone == result )
        {
            NSLog(@"rewards for share: %@!", service );
        }
        if( ![SLServiceTypeFacebook isEqualToString:service] )  // facebook behaves
            [[CBLAppDelegate instance].activeViewController dismissViewControllerAnimated:true completion:nil];
    };
    [[CBLAppDelegate instance].activeViewController presentViewController:controller animated:true completion:nil];
}
person AutomatonTec    schedule 11.11.2012
comment
Точно так же. Вы отправили отчет об ошибке в Apple? Или у вас есть лучший способ решить эту проблему? - person onevcat; 02.06.2013

Нашел проблему. Это происходит только тогда, когда обработчик завершения добавляется в TWTweetComposeViewController. Если добавлено, обязательно позвоните:

[самостоятельно уволитьModalViewControllerAnimated:YES];

person Héctor    schedule 28.09.2012
comment
Пожалуйста, используйте [self dismissViewControllerAnimated:YES completion:nil]; вместо [self dismissModalViewControllerAnimated:YES]; - person Prasad De Zoysa; 09.08.2013

Попробуй этого приятеля

   [mySLComposerSheet setCompletionHandler:^(SLComposeViewControllerResult result) {

        switch (result) {
            case SLComposeViewControllerResultCancelled:
                [self performSelector:@selector(showalert)];
                [mySLComposerSheet dismissViewControllerAnimated:YES completion:nil];
                break;
            case SLComposeViewControllerResultDone:
                [self performSelector:@selector(showalert1)];
                [mySLComposerSheet dismissViewControllerAnimated:YES completion:nil];
                break;

            default:
                break;


        }
    }];
person Superdev    schedule 05.02.2013
comment
dissmissViewControllerAnimated требуется, если вы используете Twitter, но не если вы используете Facebook - там это работает без! - person Sam; 21.05.2013

Размещение комментария выше в качестве ответа:

Вы пытались установить завершение обработчика перед представлением контроллера представления?

person Alejandro Benito-Santos    schedule 27.09.2012