UIActivityViewController, действия не завершены, параметры общего доступа не загружаются
У меня есть приложение с кнопкой "Поделиться". Эта кнопка общего доступа загружает UIActivityViewController для публикации в Facebook, Twitter, электронной почте, текстовом сообщении и т. Д.
Раньше он работал нормально, и я думаю, что он все еще отлично работает на симуляторе, но на устройствах контроллер представления отображается со всеми правильными опциями, и если вы нажмете одну из них, либо ничего не произойдет, либо, если это Почта, почтовый модал просматривать нагрузки, а затем отклоняет себя. Затем я получаю свой журнал "Операция не была выполнена", когда блок завершения возвращает значение "Ложь" для "Завершено", но значение ActivityType не было нулевым. Таким образом, он распознает выбор, но по какой-то причине не загружает активность в представление.
Я проверил материал, которым пытаюсь поделиться, даже заменил его на пустышку (как показано ниже), но все равно не повезло. Я использую обычное устройство, у меня настроены учетные записи Twitter, Mail и Facebook, текстовые сообщения тоже работают. Единственное, что работает, это копирование (т.е. когда вы копируете содержимое общего ресурса в буфер обмена). В других приложениях на том же устройстве UIActivityViewController и загрузка выбранных действий работают просто отлично. Та же проблема наблюдается и на других устройствах, на которых запущено приложение.
На самом деле не понимаю, в чем проблема здесь. Очень сбивает с толку! Любая помощь или предложения, которые стоит попробовать, будет высоко ценится. Я не вижу способа отладить эту проблему.
Вот код: (заметьте, я тоже пытался удалить изображение, не повезло)
- (void)shareTapped {
NSString *shareText = @"Testing";//[self shareText];
NSURL *url = [NSURL URLWithString:@"http://www.google.ca"]; //[self shareURL];
NSArray *activityItems = [NSArray arrayWithObjects:shareText,url, self.shareImage, nil];
UIActivityViewController *shareDrawer = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
shareDrawer.excludedActivityTypes = @[UIActivityTypePostToWeibo,UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll,UIActivityTypePrint];
shareDrawer.completionHandler = ^(NSString *activityType, BOOL completed) {
if (completed) {
NSLog(@"Selected activity was performed.");
} else {
if (activityType == NULL) {
NSLog(@"User dismissed the view controller without making a selection.");
} else {
NSLog(@"Activity was not performed.");
}
}
NSString *result = completed ? @"success" : @"fail";
if (activityType == NULL) {
result = @"dismissed";
}
};
[self presentViewController:shareDrawer animated:YES completion:nil];
}
2 ответа
Хорошо, в процессе устранения я наконец сузил преступника:
У меня есть пользовательский UISegmentedControl с пользовательским шрифтом для текста, и я вручную скорректировал смещение содержимого, чтобы оно отображалось правильно. Хотя я удалил эти строки и сегментированный элемент управления выглядит нормально.
Вот код (я подтвердил, что все три строки вызывают проблему)
[[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(4, 0) forSegmentType:UISegmentedControlSegmentLeft barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(0, 0) forSegmentType:UISegmentedControlSegmentCenter barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(-4, 0) forSegmentType:UISegmentedControlSegmentRight barMetrics:UIBarMetricsDefault];
Теперь, видя, что представления, всплывающие после выбора параметра общего доступа, не содержат сегментированных элементов управления, я понятия не имею, почему это может вызвать эту проблему. Но это определенно работает теперь, когда я удалил его.
Спасибо за тех, кто пытался помочь. Конечно, вы никак не могли догадаться, что это проблема. Вероятность того, что кто-нибудь когда-либо столкнется с этой проблемой, довольно низка, так как настройка позиции контента, вероятно, довольно редка.
Чтобы устранить эту проблему, я сделал следующие шаги:
- Я проверил, имеет ли проблема какое-то отношение к свойствам UIActivityViewController, которые я настраивал, или к элементам действий, которыми я делился. Это не так.
- Я проверил, правильно ли работал UIActivityViewController при вызове из другого контроллера представления внутри моего приложения. Это не так.
- Я сделал пустой контроллер представления с кнопкой, которая заставляет универсальный UIActivityViewController показывать при нажатии кнопки панели. Я сделал это своим корневым видом. Это сработало, показав таким образом, что это была изолированная проблема.
- Вместо того, чтобы сделать этот контроллер представления корнем моего приложения, я вытолкнул его из моего обычного основного вида. Это больше не работало, таким образом определяя, что проблема, вероятно, как-то связана с моим основным взглядом.
- Я закомментировал весь код в viewDidLoad, viewDidAppear и viewWillAppear, за исключением добавления кнопки на панель навигации, которая бы загружала мой тест совместного использования. Это сработало. Затем я раскомментировал viweDidAppear и viewWillAppear, все еще работал. Поэтому я раскомментировал фрагменты viewDidLoad, пока не выяснил, в чем именно проблема.
Что я узнал: для таких странных проблем, как эта (например, те, которые похожи на ошибку iOS или что-то в этом роде, но вы не можете найти никого, пишущего об этом), вам следует потратить больше времени на отладку, прежде чем пытаться делать переполнение стека. (Я действительно должен знать это сейчас, но каждая новая проблема для отладки ощущается как исключение из этого правила)
Пожалуйста, прокомментируйте ниже, если вы знаете, почему настройка позиции содержимого UISegmentedControl может испортить общий доступ из UIActivityViewController, даже если эти представления не содержат сегментированные элементы управления
Спасибо
У меня была такая же проблема, вот что я сделал, чтобы ее преодолеть.
Я бы порекомендовал добавить Social.framework в ваш Link Binary и использовать
SLComposeViewController *socialShare = [SLComposeViewController composeViewControllerForServiceType:shareType];
Где может быть shareType SLServiceTypeFacebook
или же SLServiceTypeTwitter
,
Я создал всплывающее окно UIAlertview, чтобы показать параметры общего доступа для пользователя
UIAlertView *social = [[UIAlertView alloc]initWithTitle:@"Share" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Twitter", @"Facebook", @"Email", nil];
и в зависимости от того, какой из них они выбрали (используя методы делегата UIAlertview), контент может быть соответствующим образом предоставлен, и это отличная альтернатива UIActivityViewController.
Надеюсь, это предложение поможет, ура, Джим.