UIActivityViewController & UIDocumentInteractionController не показват опции

Нов съм в UIActivityViewController и може би ми липсва основно разбиране. Това, което се опитвам да направя, е да прикача csv, xml и vcard файл към контролера на активността и да покажа опции за dropbox, google drive и т.н. Изтеглих и инсталирах приложения за dropbox, google drive и т.н. на моя iPhone.

Сега, когато стартирам UIActivityViewController, всичко, което виждам, е приложението за съобщения и имейл по подразбиране в моя контролер за активност. Как мога да накарам други приложения да се показват и на техните? Трябва ли да инсталирам отделни SDK за всяко приложение и по някакъв начин да ги включа в моето приложение?

Това е, което бих искал да видя

въведете описание на изображението тук

но това е, което виждам вместо това.

въведете описание на изображението тук

Ето кода, който съм пробвал досега

-(IBAction) dropBoxAction
{

    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask ,YES);
    NSString* documentsPath = [paths objectAtIndex:0];

    //CSV
    NSMutableString *fileNameStr = [NSMutableString stringWithFormat:@"test_CSV_Backup.csv"];
    NSString* csvDataFileStr = [documentsPath stringByAppendingPathComponent:fileNameStr];
    NSData *csvData = [NSData dataWithContentsOfFile:csvDataFileStr];

    //EXCEL
    NSMutableString *fileNameStr2 = [NSMutableString stringWithFormat:@"test_EXCEL_Backup.xml"];
    NSString* excelDataFileStr = [documentsPath stringByAppendingPathComponent:fileNameStr2];
    NSData *excelData = [NSData dataWithContentsOfFile:excelDataFileStr];

    //VCARD
    NSMutableString *fileNameStr3 = [NSMutableString stringWithFormat:@"test_VCARD_Backup.vcf"];
    NSString* vcardDataFileStr = [documentsPath stringByAppendingPathComponent:fileNameStr3];
    NSData *vcardData = [NSData dataWithContentsOfFile:vcardDataFileStr];


    //adding them all together
    NSMutableArray *sharingItems = [NSMutableArray new];
    [sharingItems addObject:csvData];
    [sharingItems addObject:excelData];
    [sharingItems addObject:vcardData];

    UIActivity *activity = [[UIActivity alloc] init];
    NSArray *applicationActivities = @[activity];

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:applicationActivities];
    [self presentViewController:activityController animated:YES completion:nil];


}

person Sam B    schedule 30.11.2013    source източник


Отговори (4)


Както каза @rmaddy, трябва да използвате UIDocumentInteractionController, за да замените UIActivityViewController, точно така:

UIDocumentInteractionController *dc = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:fileNameStr]];
[dc presentOptionsMenuFromRect:self.view.bounds inView:self.view animated:YES];
person shanegao    schedule 30.11.2013
comment
Благодаря ти за помощта. Бях заседнал, че това е точно липсващият код, от който се нуждаех. Вашият отговор е маркиран. - person Sam B; 01.12.2013

За всеки, който се интересува от бъдещето, ето кода на едно място. Оценете го, ако това помага.

Във вашия *.h файл добавете това

@interface v1BackupComplete : UIViewController <UIDocumentInteractionControllerDelegate>
{

    UIDocumentInteractionController *docController;

}

Във вашия *.m файл добавете това

/************************
 * Dropbox ACTION
 ************************/
-(IBAction) dropBoxAction2
{
    NSLog(@"dropBoxAction2 ...");

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask ,YES);
    NSString* documentsPath = [paths objectAtIndex:0];
    NSMutableString *fileNameStr3 = [NSMutableString stringWithFormat:@"test_VCARD_Backup.vcf"];
    NSString* vcardDataFileStr = [documentsPath stringByAppendingPathComponent:fileNameStr3];


    NSURL *fileURL = [NSURL fileURLWithPath:vcardDataFileStr];
    docController = [self setupControllerWithURL:fileURL
                                   usingDelegate:self];

    bool didShow = [docController presentOpenInMenuFromRect:self.view.bounds inView:self.view animated:YES];

    NSLog(@"didShow %d ...", didShow);

    if (!didShow)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ERROR"
                                                        message:@"Sorry. The appropriate apps are not found on this device."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles: nil];
        [alert show];
    }
}


#pragma mark - UIDocumentInteractionControllerDelegate
- (UIDocumentInteractionController *) setupControllerWithURL:(NSURL *)fileURL
                                               usingDelegate:(id <UIDocumentInteractionControllerDelegate>)         interactionDelegate {

    UIDocumentInteractionController *interactionController =
    [UIDocumentInteractionController interactionControllerWithURL:fileURL];
    interactionController.delegate = interactionDelegate;

    return interactionController;
}

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
    return self;
}

- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller
{
    return self.view;
}

- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller
{
    return self.view.frame;
}
person Sam B    schedule 30.11.2013

UIActivityViewController показва само стандартни вградени дейности плюс всички персонализирани дейности, които предавате като applicationActivities.

За това, което правите, не искате UIActivityViewController. Искаш UIDocumentInteractionController. Ако просто искате да покажете съществуващи приложения, които могат да отворят файла, използвайте един от presentOpenInMenuFrom... методите.

Но имайте предвид, че трябва да се използва само за един файл, а не за три.

Предаването на три файла няма смисъл в този контекст.

person rmaddy    schedule 30.11.2013

Използвах вашия код тук, за да отворя с dropbox и само след като използвах метода presentPreview (по-долу), той проработи за мен. PDF файлът беше показан като визуализация и след това щракнете върху бутона за споделяне на предварителен преглед (горе вдясно) опцията за капак („отвори в капак“) свърши работата. Както работи в приложението за поща във визуализацията на прикачения файл.

[interactionController presentPreviewAnimated:YES];

Когато се опитах да отворя с presentOpenInMenuFromRect, той се срина при избиране на „open in dropbox“.

person Chen Cohen    schedule 12.07.2017