Подтвердить что ты не робот

Активность активности UIActivityViewController на iPad, а не на popover

При использовании подкласса UIActivity клиента в iOS 6 можно указать настраиваемый контроллер представлений, который будет отображаться, когда ваше действие выбрано из начального представления UIActionViewController. Вы делаете это, возвращая ссылку на настраиваемый контроллер представлений из вашего подкласса UIActivity activityViewController.

В соответствии с ссылкой на класс UIActivity:

activityViewController

По умолчанию этот метод возвращает nil. Подклассы, которые предоставляют дополнительный пользовательский интерфейс с помощью контроллера вида, могут переопределить этот метод, чтобы вернуть этот контроллер представления. Если этот метод возвращает действительный объект, система представляет для вас возвращенный контроллер представлений вместо вызова метода performActivity. На iPad ваш контроллер просмотра представлен внутри popover. На iPhone и iPod touch ваш контроллер просмотра представлен в формате.

Ваш пользовательский контроллер представления должен предоставить представление с вашим пользовательским интерфейсом и должен обрабатывать любые пользовательские взаимодействия внутри этих представлений. По завершении действия не отключайте контроллер просмотра самостоятельно. Вместо этого вызовите метод activityDidFinish: и пусть система отклонит его для вас.

Обратите внимание, что бит в конце первого абзаца: На iPad ваш контроллер просмотра представлен внутри popover. На iPhone и iPod touch ваш контроллер просмотра представлен в формате.

Однако, на iPad контроллер представления, возвращаемый activityViewController, всегда отображает модально, независимо от того, как я представляю UIActivityViewController (либо модально, либо через popover). При представлении через popover он вызывает его сбой, поскольку он не считает, что он был уволен.

Что я делаю неправильно? Это ошибка в iOS 6?


Обновление: здесь представлен простой проект Xcode, который иллюстрирует проблему. Не стесняйтесь клонировать его и поиграть, чтобы увидеть, видите ли вы, где мы ошибаемся: github.com/simonwhitaker/GSActivityDemo

4b9b3361

Ответ 1

Как мы говорим о UIActivityViewController, который представляет собой представление, показывающее доступные действия для пользователя. Apple заявляет следующее...

Ваше приложение отвечает за настройку, представление и отклонение этого контроллера представления. Конфигурация для контроллера представления включает указание объектов данных, на которых должен действовать контроллер представления. (Вы также можете указать список настраиваемых сервисов, поддерживаемых вашим приложением.) При представлении контроллера вида вы должны сделать это, используя соответствующие средства для текущего устройства. На iPad вы должны представить контроллер представления в popover. На iPhone и iPod touch вы должны представить его в текстовом формате.

Я взял последнюю строку в качестве признака того, что вам нужно обрабатывать представление представления, поэтому я проверяю, работает ли код на iPad и соответственно использует UIPopover. Как вы можете здесь... https://github.com/bufferapp/buffer-uiactivity/blob/master/BufferUIActivity/Views/FirstViewController.m в следующем методе.

-(IBAction)openUIActivityView:(id)sender {

    NSString *text = @"Hello world";
    NSString *url = @"http://bufferapp.com";


    NSArray *activityItems = @[text, url];

    BufferUIActivity *bufferActivity = [[BufferUIActivity alloc] init];

    UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:@[ bufferActivity ]];


    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self presentViewController:activityView animated:YES completion:^{

        }];
    } else {
        // Change Rect to position Popover
        self.popup = [[UIPopoverController alloc] initWithContentViewController:activityView];
        [self.popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.width/2, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }

}

Ответ 2

Я думаю, что проблема с контроллером представления активности, который не отображается в popover, является ошибкой, и документы отражают правильное намерение. Тем не менее, я не знаю, как можно обойти этот подход.

Тем не менее, часть об отклонении диспетчера просмотров - это другая проблема. Вы не должны отклонять контроллер представления, который вы возвращаете из -[UIActivity activityViewController], но вы отвечаете за отклонение представленного вами popover, что, в свою очередь, также удалит ваш пользовательский контроллер представления из иерархии, (И поскольку он работает таким образом, я склонен полагать, что пользовательский контроллер представления обычно должен отображаться в popover.)

Вот пример с кодом ваш пример:

UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                                                 applicationActivities:applicationActivities];

vc.completionHandler = ^(NSString *activityType, BOOL completed){
  [self.activityPopoverController dismissPopoverAnimated:YES];
};

Ответ 3


У меня была та же проблема в iOS 7. Решение показать пользовательское представление в popover - это создать и показать его в методе -(void)performActivity вместо того, чтобы возвращать его в -(UIViewController *)activityViewController.

Вы можете увидеть пример кода в моем вопросе/ответе по этой ссылке:
iOS 7 пользовательская UIActivity как popover

Ответ 4

У меня была такая же проблема, но она была решена, установив ViewController на:

[yourViewController setModalPresentationStyle:UIModalPresentationPageSheet];

в

- (UIViewController *)activityViewController

надеюсь, что это поможет