IOS SDK Förhandsgranska och öppna dokument

Sandboxing på iOS gör plattformen mycket säkrare och detta till stor nytta för varje användare av plattformen. På grund av de stränga regler som är förknippade med sandboxing är det emellertid inte trivialt att dela data mellan applikationer. En ofta förbisett klass som hjälper till att dela dokument mellan applikationer är UIDocumentInteractionController klass. I det här snabba tipset kommer jag att visa dig hur du kan använda den här klassen för att förhandsgranska dokument samt öppna dokument i andra program installerade på enheten.


Samverkan med dokument

Jag måste erkänna att jag var lite förvånad över att upptäcka det UIDocumentInteractionController har varit med oss ​​sedan iOS 3.2. De UIDocumentInteractionController klassen är flexibel i sin användning och kraftfullare än de flesta av oss inser. Det tillåter inte bara att utvecklare öppnar dokument i andra program installerade på enheten, det stöder också förhandsvisning, utskrift, e-post och kopiering av dokument.

Använda UIDocumentInteractionController klassen är enkel. Det första steget är att initiera en förekomst av klassen genom att åberopa sin enda klassmetod, interactionControllerWithURL:, och passerar webbadressen (NSURL) av dokumentet som du tänker arbeta med. När du har ställt in dokumentkontaktkontrollens delegerade egenskap, implementerar du lämpliga delegeringsmetoder.

Tänk på att UIDocumentInteractionController är inte en underklass av UIViewController. Med andra ord, även om förhandsgranskning av ett dokument förmedlas av UIDocumentInteractionController, du måste berätta för dokumentinteraktionskontrollen som visar kontrollenheten för att kunna förhandsgranska dokumentet. Vad det här exakt betyder kommer att bli klart när vi bygger provapplikationen. I provprogrammet visar jag hur du (1) förhandsgranskar ett dokument och (2) öppnar ett dokument i ett annat program som stöder dokumentets filtyp.


Steg 1: Ställa in projektet

Som jag nämnde för ett ögonblick så tillåter vår applikationsprogram att användarna förhandsgranskar ett dokument och öppnar det i en annan applikation som är installerad på enheten. Det senare är ofta mycket användbart om du vill ge användarna större flexibilitet när det gäller vad de kan göra med de data som lagras i din ansökan. Ett vanligt exempel är att öppna ett foto i ett fotoredigeringsprogram, till exempel iPhoto.

Skapa ett nytt projekt i Xcode genom att välja Enkel visningsprogram mall från listan med mallar (figur 1). Namn på din ansökan Dokument, Ange en företagsidentifierare, inställd iPhone för enhetsfamiljen och kontrollera Använd automatisk referensräkning. Resten av kryssrutorna kan lämnas obekant för detta projekt (figur 2). Berätta Xcode där du vill spara projektet och klicka på Skapa knapp.


Figur 1
figur 2

Steg 2: Skapa användargränssnittet

Användargränssnittet i vår applikation innehåller två knappar, en för att förhandsgranska ett PDF-dokument och en för att öppna ett PDF-dokument i en annan applikation. Innan vi skapar användargränssnittet, skapa en åtgärd för varje knapp i visningskontrollens implementeringsfil enligt nedan.

 - (IBAction) förhandsgranskningDokument: (id) avsändare 
 - (IBAction) openDocument: (id) avsändare 

Välj MTViewController.xib och dra två UIButton instanser från Objektbibliotek till höger i bildskärmens kontroll (figur 3). Välj Filens ägare objekt till vänster, öppna Anslutningsinspektör, och anslut de åtgärder som vi skapade för en stund sedan med knapparna (figur 4). Det är allt vi behöver göra i Interface Builder.


Figur 3
Figur 4

Steg 3: Förhandsgranska ett dokument

Dokumentet som vi ska arbeta med är ett PDF-dokument. Du kan använda ett PDF-dokument, men jag har inkluderat ett PDF-dokument med källfilerna i denna snabba tips. Det är Apples iOS Programmeringsguide, som du också kan hitta online. Dra dokumentet i ditt projekt och se till att markera kryssrutan Kopiera objekt till destinationsgruppens mapp (om det behövs) när du uppmanas (figur 5). Se också till att dokumentet läggs till i Dokument mål (figur 5).


Figur 5

När du använder UIDocumentInteractionController klass, är det viktigt att hålla två saker i åtanke, (1) du behöver hålla en hänvisning till dokumentinteraktionskontrollen och (2) UIDocumentInteractionControllerDelegate protokollet måste genomföras. Börja med att uppdatera bildkontrollens huvudfiler enligt nedan för att informera kompilatorn om att MTViewController klassen överensstämmer med UIDocumentInteractionControllerDelegate protokoll.

 #importera  @interface MTViewController: UIViewController  @slutet

Lägg till en privat egendom av typen i visningskontrollens implementeringsfil UIDocumentInteractionController och namnge det documentInteractionController. Den här egenskapen lagrar referensen till dokumentinteraktionskontrollen som vi ska använda.

Låt oss nu titta på genomförandet av previewDocument: verkan. Vi börjar med att erhålla webbadressen (NSURL) av dokumentet. Eftersom dokumentet är en del av applikationspaketet är det väldigt enkelt att erhålla dokumentets webbadress tack vare en bekväm metod av NSBundle klass (se nedan).

 - (IBAction) previewDocument: (id) avsändare NSURL * URL = [[NSBundle mainBundle] URLForResource: @ "sample" medExtension: @ "pdf"]; om (URL) // Initialize Document Interaction Controller self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL: URL]; // Konfigurera Document Interaction Controller [self.documentInteractionController setDelegate: self]; // Förhandsgranska PDF [self.documentInteractionController presentPreviewAnimated: YES]; 

Om en giltig URL returneras till oss initierar vi en instans av UIDocumentInteractionController klass och skicka dokumentets URL. Vi lagrar en referens till dokumentinteraktionsregulatorn i documentInteractionController egendom som vi skapade för en minut sedan. Våra visningscontroller kommer att fungera som delegat för dokumentinteraktionskontrollen. Att presentera en förhandsvisning av PDF-dokumentet är lika enkelt som att ringa presentPreviewAnimated: på dokumentets interaktionsregulator.

Om du skulle bygga och köra ansökan nu skulle du märka att inget händer när knappen märktes Förhandsvisning tappas. Det finns en delegatmetod som vi måste implementera först. För några minuter sedan berättade jag för dig att det är viktigt att inse att UIDocumentInteractionController klassen är en underklass av NSObject, inte UIViewController. Även om det kommer att ta hand om att visa dokumentet, måste vi berätta för dokumentinteraktionskontrollen som visar kontrollenhet som ska användas för att förhandsgranska dokumentet. En av de delegerade metoderna i UIDocumentInteractionControllerDelegate protokollet frågar delegaten för en vykontroll som den kan använda för att förhandsgranska dokumentet. Den delegerade metoden är lämpligt namngiven documentInteractionControllerViewControllerForPreview:. Eftersom vi vill visa förhandsgranskningen i vår huvudvisningskontroll kan vi enkelt återvända själv som visas i genomförandet nedan. Vad det här betyder är att dokumentinteraktionskontrollen använder vår vykontroll för att förhandsgranska PDF-dokumentet. Den kommer att presentera en modalvy där den presenterar dokumentet.

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

Naturligtvis kan du ändra genomförandet av documentInteractionControllerViewControllerForPreview: för att passa dina behov. Med delegatormetoden implementerad är det dags att bygga och springa vår ansökan för första gången och prova den (figur 6). Observera att du även kan dela provdokumentet via e-post, skriva ut det eller kopiera det till urklippet. Dessutom är det möjligt att öppna dokumentet i någon annan applikation som stöder dokumentets filtyp. Tryck på knappen längst upp till höger för att se vad jag menar (figur 7).


Figur 6
Figur 7

Steg 4: Öppna ett dokument

I många situationer är det dock lämpligare att tillåta användare att öppna ett dokument i en annan applikation utan att först visa en förhandsvisning av dokumentet. För att göra det möjligt i vår programprogram måste vi implementera Opendocument: verkan. Som i previewDocument: åtgärd får vi URL-adressen till PDF-dokumentet i applikationspaketet och använder det för att initiera en instans av UIDocumentInteractionController klass. Efter att ha ställt in delegat för dokumentinteraktionskontrollen presenterar vi en meny genom att ringa presentOpenInMenuFromRect: InView: på dokumentets interaktionsregulator. De CGRect att vi passerar som det första argumentet är rammens ram som du kan se i kodfältet nedan.

 - (IBAction) openDocument: (id) avsändare UIButton * button = (UIButton *) avsändare; NSURL * URL = [[NSBundle mainBundle] URLForResource: @ "sample" medExtension: @ "pdf"]; om (URL) // Initialize Document Interaction Controller self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL: URL]; // Konfigurera Document Interaction Controller [self.documentInteractionController setDelegate: self]; // Present Öppna i menyn [self.documentInteractionController presentOpenInMenuFromRect: [knapprama] inView: self.view animated: YES]; 

Att testa Opendocument: åtgärd är det viktigt att du kör provprogrammet på en fysisk enhet. Anledningen är enkel. Operativsystemet kontrollerar vilka applikationer på enheten som stöder den filtyp (UTI) som vi vill öppna. Om det inte kan hitta några program som stöder motsvarande filtyp, visas det inte någon Öppna In menyn och det är vad som händer i iOS-simulatorn.

För att testa den här funktionen måste du se till att du har en applikation installerad på din fysiska enhet som accepterar PDF-dokument, till exempel Dropbox eller Amazons Kindle-applikation.


Figur 8

Slutsats

Som du kan se är det väldigt enkelt att förhandsgranska och öppna dokument med hjälp av UIDocumentInteractionController klass. Jag rekommenderar att du utforskar sin klassreferens såväl som UIDocumentInteractionControllerDelegate protokoll. Det finns många fler delegerade metoder som kan vara till nytta, särskilt när du arbetar med större dokument eller komplexa arbetsflöden.