2014-01-28 2 views
2

У меня есть приложение, в котором есть кнопка общего доступа. Эта кнопка share загружает UIActivityViewController для доступа к Facebook, Twitter, электронной почте, текстовому сообщению и т. Д.UIActivityViewController, действия не выполняются, параметры совместного доступа не загружаются

Он работал нормально, и я думаю, что он все еще отлично работает на симуляторе, но на устройствах появляется контроллер вида с все правильные параметры, и если вы нажмете один, либо ничего не произойдет, либо, если это Mail, загружается модальный вид почты, а затем отклоняется. Затем я получаю свой журнал «Активность не выполнялась». Это когда блок завершения возвращает false для завершенного, но 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]; 
} 
+0

вы пробовали вместо добавления данных в виде отдельных элементов в массиве, реализация протокола UIActivityItemSource на объекте, который находится в массиве? не уверен, действительно ли это по-другому отличается от вашего случая, поскольку это звучит так, как будто его неудача заключается в представлении представления, но я думаю, что это стоит того, чтобы изменить способ подачи данных. – bolnad

+0

Я поставил почти такой же код в другое, гораздо более простое приложение, над которым я работаю, и он отлично работает ... Что может быть испорчено в моем приложении? – shim

+0

Также попытался поставить UIActivityViewController внутри другого контроллера представления моего проблемного приложения, и это не сработало. – shim

ответ

1

OK, метод исключения я, наконец, сузил виновник:

У меня есть пользовательский 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]; 

Теперь, видя, как мнения, что всплывающее окно после выбора опции акции НЕ сегментировал CONTROLS в них , Я не знаю, почему это может вызвать эту проблему. Но теперь это определенно работает, когда я удалил его.

Спасибо за те из вас, кто пытался помочь. Конечно, вы не могли бы догадаться, что это была проблема.Скорее всего, вероятность того, что кто-нибудь столкнется с этой проблемой, в первую очередь будет такой, поскольку корректировка позиции контента, вероятно, довольно редка.

Для отладки этой проблемы я последовал за следующие действия:

  1. я протестированные, если вопрос что-то делать со свойствами на UIActivityViewController что я устанавливающих или элементов деятельности я делил. Это не так.
  2. Я тестировал, если UIActivityViewController правильно работал при вызове из другого контроллера представления внутри моего приложения. Это не так.
  3. Я сделал пустой контроллер представления с кнопкой, которая вызывает отображение общего символа UIActivityViewController при нажатии кнопки панели. Я сделал это в корне. Это сработало, показывая, что это изолированная проблема.
  4. Вместо того чтобы сделать этот контроллер просмотра корнем моего приложения, я вытолкнул его из своего обычного основного вида. Он больше не работал, тем самым определяя, что проблема, вероятно, имеет какое-то отношение к моему основному виду.
  5. Я прокомментировал весь код в viewDidLoad, viewDidAppear и viewWillAppear, за исключением добавления кнопки в навигационную панель, которая загружала бы мой тестовый тест. Это сработало. Затем я раскодировал viweDidAppear и viewWillAppear, все еще работал. Таким образом, я раскопал куски viewDidLoad, пока не понял, в чем проблема.

Что я узнал: для таких странных проблем (то есть тех, которые кажутся ошибкой iOS или что-то в этом роде, но вы не можете найти никому об этом), вы должны потратить больше времени на отладку, прежде чем пытаться опубликовать переполнение стека. (я действительно знаю, что это в настоящее время, но каждая новая проблема для отладки чувствует, как исключение из этого правила)

Пожалуйста, прокомментируйте ниже, если вы знаете, почему регулируя положение содержимого UISegmentedControl бы испортить обмен с UIActivityViewController, даже если эти мнения не содержат сегментированные управления

Благодарности

0

Если бы тот же вопрос тоже, вот что я сделал, чтобы преодолеть его.

Я бы рекомендовал добавлять 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.

Надеюсь, это предложение поможет, ура, Джим.

+0

Спасибо, но на самом деле не решение. Плюс я не хочу ограничивать это только Facebook и Twitter. – shim

+0

Я понимаю, что он более ограничен, хотя для людей, ищущих FB, Twitter или электронную почту (электронная почта не SLC, но может быть легко добавлена ​​как опция для предупреждения), тогда я надеюсь, что это хорошая альтернатива. Надеюсь, вам удастся его отсортировать. Cheers –

+0

Что такое с голосом? Это альтернатива, как просили! –