Ответ 1
Проблема, по-видимому, была исправлена в iOS 7, протестирована на 7.0 beta build 11A4449d.
У меня есть код совместного доступа, который выглядит следующим образом:
SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:…];
[composer setInitialText:…];
[composer addURL:…];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
[someController dismissViewControllerAnimated:YES completion:^{
… // 1
}];
}];
[someController presentModalViewController:composer animated:YES];
Проблема в том, что код ведет себя по-разному для Facebook и Twitter. Когда пользователь подтверждает экран компоновки Facebook, композитор, по-видимому, отклоняет себя, потому что обработчик завершения, обозначенный как 1, никогда не вызывается, и даже когда я удаляю вызов dismissViewControllerAnimated:
, все работает нормально.
С другой стороны, когда пользователь подтверждает экран компоновки Twitter, и я не увольняю его вручную, экран компоновки открывается, но приложение остается застрявшим, как будто какой-то контроллер все еще находится на переднем плане. Когда я добавляю вызов dismissViewControllerAnimated:
, проблема исчезает, и обработчик завершения (1) вызывается правильно.
Вы также заметили это поведение? Я делаю что-то неправильно? Это текущий код iOS 6, на GitHub. Я сообщил об этой проблеме Apple (Radar # 12642889), пока не было никакой реакции.
Проблема, по-видимому, была исправлена в iOS 7, протестирована на 7.0 beta build 11A4449d.
Я делаю что-то подобное в своем приложении, и единственное отличие от вашего кода заключается в том, что я отправляю dismissModalViewControllerAnimated:
в self
вместо отправки его в контроллер просмотра.
Как facebook, так и twitter композитор отходит.
Это мой код:
SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:text];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
...
[self dismissModalViewControllerAnimated:YES];
}];
[self presentModalViewController:composer animated:YES];
Я подтвердил вашу проблему с поведением:
В версии Twitter вызывается обработчик завершения, который вы установили на контроллере представления, и ожидает, что вы вызовите функцию rejectViewController из этого обработчика.
Однако версия Facebook вызывает функцию rejectViewController перед вызовом обработчика завершения. Если вы затем вызываете функцию rejectViewController самостоятельно, ничего не происходит, и вы не получаете никакого обратного вызова из любого блока завершения, который вы могли бы передать функции rejectViewController.
Если вы оставите вызов rejectViewController, тогда разделение Twitter будет зависеть, но работает Facebook.
Проблема заключается в том, чтобы создать решение, если Apple собирается исправлять поведение, так как ваше решение будет нарушено. Основная проблема заключается в том, что поведение не совпадает между поведением Weibo, Twitter и Facebook, использующим тот же VC общественного обмена.
Вот как я исправил проблему:
SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:serviceType];
if(vc==nil)
{
[self.delegate imageSaveDidSucceed:NO];
}
else
{
[vc addImage:self.image];
vc.completionHandler = ^(SLComposeViewControllerResult result) {
DEBUG_LOG(@"social sharing completed");
if(self.presentedViewController)
{
DEBUG_LOG(@"presented vc is not nil");
[self dismissViewControllerAnimated:YES completion:^{
DEBUG_LOG(@"dismissed vc and calling imageSaveDidSucceed");
[self.delegate imageSaveDidSucceed:YES];
}];
}
else
{
DEBUG_LOG(@"presented vc is nil");
[self.delegate imageSaveDidSucceed:YES];
}
};
[self presentViewController:vc animated:YES completion: ^{DEBUG_LOG(@"vc was presented");}];
}