Aflați cum să utilizați puterea Cadrului Social cu acest post, preluat din capitolul 11 al cărții Mobiletuts + Decodarea iOS 6 SDK!
Introducerea cadrului Twitter în iOS 5 a fost primul pas spre integrarea iOS-ului cu rețelele sociale populare. În iOS 6, Apple a introdus cadrul Social. Nu numai că cadrul Social înlocuiește efectiv cadrul Twitter, ci și extinde funcționalitatea acestuia prin adăugarea de suport atât pentru Facebook, cât și pentru Sina Weibo.
Chiar dacă cadrul Twitter a fost depreciat din iOS 6, este din fericire o sarcină banală de a migra codul existent din cadrul Twitter în cadrul Social. API-urile din cadrul Social nu menționează rețelele sociale specifice. Componenta de rețea a fost abstractizată, ceea ce face ca adăugarea de suport pentru noile rețele sociale să reprezinte în viitor o sarcină fără durere. Linia de fund: Vestea bună pentru dezvoltatori este că pornirea și funcționarea cu cadrul Social sunt ușoare, mai ales dacă deja cunoașteți cadrul Twitter.
În acest capitol vă voi oferi o imagine de ansamblu asupra cadrului social și a ceea ce acesta are de oferit și vă voi arăta care sunt opțiunile dvs. atunci când doriți să adăugați o componentă socială aplicațiilor dvs. În timp ce acest capitol va acoperi numai elementele de bază ale cadrului social, următorul capitol va vorbi despre o integrare mai aprofundată a aplicației dvs. cu cadrul social. Ca un bonus suplimentar, voi discuta, de asemenea, clasa UIActivityViewController. Aceasta este o altă adăugire la UIKit, care face ca partajarea conținutului să fie briză!
Înainte de iOS 6, partajarea conținutului nu a fost atât de ușoară. Dacă ați fost vreodată integrat Facebook cu o aplicație iOS, atunci aproape sigur ați întâlnit un număr de obstacole de-a lungul drum. În iOS 6, cu toate acestea, au fost făcute o serie de îmbunătățiri semnificative. Începând cu versiunea iOS 6, integrarea cu rețelele sociale este acum cuprinsă în sistemul de operare, ceea ce face mult mai ușor accesul social la dezvoltatorii SDK.
La momentul redactării, cadrul social susține integrarea cu Facebook, Sina Weibo și Twitter. Sprijinul pentru Twitter este motivul evident pentru deprecierea cadrului Twitter. Sina Weibo ar putea fi o rață ciudată în rând pentru unii dintre voi. Sina Weibo este o platformă extrem de populară de microblogging în China, una dintre națiunile cele mai populate de pe pământ, deci nu este atât de ciudat să vedem integrarea sa în iOS.
Având în vedere cele de mai sus, ce opțiuni aveți atunci când una dintre aplicațiile dvs. trebuie integrată cu Facebook, Twitter sau Sina Weibo? Cadrul social oferă două opțiuni, utilizând (1) SLComposeViewController
clasă sau (2) SLRequest
clasă. Dacă ați lucrat cu framework-ul Twitter în iOS 5, atunci acele nume de clase vor suna cu siguranță un clopot.
În acest capitol, voi mări imaginea SLComposeViewController
clasă. Este o soluție ușor de utilizat și elegantă pentru a permite utilizatorilor dvs. să partajeze conținut cu Twitter, Facebook și Sina Weibo. Să aruncăm o privire la noul venit.
SLComposeViewController
Cea mai ușoară modalitate de a partaja conținutul cu una dintre rețelele sociale acceptate este prin utilizarea SLComposeViewController
clasă. Prefixul său, SL, indică faptul că face parte din cadrul social. SLComposeViewController
clasa este echivalentul TWTweetComposeViewController
clasa de cadru Twitter. Cea mai importantă diferență este aceea SLComposeViewController
nu este legată de nicio rețea socială în particular.
Crearea unui exemplu de SLComposeViewController
este la fel de ușor ca și chemarea composeViewControllerForServiceType:
pe clasă și trecând tipul de serviciu, adică rețeaua socială pe care o vizați. La momentul redactării, există trei opțiuni, SLServiceTypeTwitter
, SLServiceTypeFacebook
, și SLServiceTypeSinaWeibo
.
Aveți posibilitatea să configurați SLComposeViewController
exemplu prin setarea textului inițial sau adăugarea unei imagini sau a unui link. Configurarea SLComposeViewController
instanță este un pas opțional deoarece utilizatorul va putea modifica conținutul mesajului înainte de a-l trimite la serviciul vizat.
Înainte de a prezenta administratorul de vizualizare a compunului către utilizator, este o practică bună să setați dispozitivul de procesare a finalizării (SLComposeViewControllerCompletionHandler
). Ultimul este un bloc care este executat când cererea pentru serviciu este terminată, cu succes sau fără succes. Blocul are un parametru, rezultatul cererii. Acest lucru poate fi util dacă doriți să informați utilizatorul dacă cererea a avut succes sau nu.
Prezentarea SLComposeViewController
la utilizator se face prin trimiterea lui un mesaj de presentViewController: animat:
la fel ca și ceilalți controler vizual (modal). După cum am menționat mai devreme, utilizatorul poate încă edita mesajul, poate să eticheteze mesajul sau să adauge o imagine sau un link. Opțiunile, precum și interfața cu utilizatorul SLComposeViewController
de exemplu, depind de serviciul vizat. Dacă utilizatorul trimite un mesaj către Facebook, de exemplu, vizualizarea modală a SLComposeViewController
exemplul este împodobit cu schema de culoare purpurie cunoscută.
SLComposeViewController
clasa are o altă metodă de clasă care merită menționată, isAvailableForServiceType:
. TWTweetComposeViewController are un nume similar cu metoda de clasă, canSendTweet
. Această metodă permite aplicației dvs. să solicite sistemului de operare dacă serviciul pe care doriți să-l vizați este disponibil. Ca și în cazul composeViewControllerForServiceType
, metoda de clasă va accepta un tip de serviciu care indică ce serviciu este vizat. Chiar dacă isAvailableForServiceType:
returnează a DA
sau NU
, sistemul de operare efectuează o serie de verificări pentru dvs. în spatele scenei. Acesta va verifica dacă rețeaua socială este accesibilă și, mai important, va verifica dacă utilizatorul a instalat un cont valid pentru serviciul vizat. Să examinăm mai atent conturile de utilizator și modul în care sunt gestionate de sistemul de operare.
Cadrul social adoptă un concept cunoscut sub numele de o singură logare (SSO) și este important să înțelegem implicațiile acestei decizii de proiectare. Puneți pur și simplu, nu mai este necesar pentru fiecare aplicație terță parte să se autentifice cu serviciul țintă, sistemul de operare acum are grijă de acest lucru pentru dvs. și expune o serie de puncte finale dezvoltatorilor prin cadrul Social. După cum probabil ați ghicit, aceasta înseamnă că este necesară o locație centrală pentru stocarea conturilor utilizatorului. Această locație centrală este, desigur, aplicația Setări pentru iOS și permite utilizatorilor să gestioneze detaliile rețelei sociale din cadrul Setărilor face ca schimbul de conținut din interiorul aplicațiilor să fie mult mai eficient.
În timp ce aplicația Setări iOS 6 oferă doar opțiunea de a gestiona un cont Facebook, utilizatorii pot controla mai multe conturi Twitter. Prin stocarea conturilor utilizatorului într-o singură locație centrală, dezvoltatorii de aplicații terță parte nu mai trebuie să gestioneze ele însele aceste date sensibile.
UIActivityViewController
UIActivityViewController
este un plus minunat pentru UIKit. Aceasta face ca partajarea conținutului să fie o briză. Cum implică numele clasei, UIActivityViewController
este o subclasă de UIViewController
. UIActivityViewController
face ca conținutul de partajare să fie trivial, oferindu-i utilizatorului o gamă de opțiuni de alegere. Utilizatorul poate să partajeze conținut prin e-mail, Twitter sau doar să insereze o adresă URL în clipboard. Există destul de puține opțiuni de alegere, iar obiectivele nu se limitează la cele trei rețele sociale susținute de cadrul social. Dupa cum UIActivityViewController
numele implică, clasa face parte din UIKit, nu cadrul social. Cu alte cuvinte, nu este nevoie să vă conectați proiectul împotriva cadrului Social dacă doriți să utilizați doar UIActivityViewController
clasă.
Chiar dacă UIActivityViewController
nu face parte din cadrul social, am ales să o includ în acest capitol, deoarece împărtășește un anumit motiv cu cadrul social. De fapt, veți observa în câteva momente UIActivityViewController
are o mulțime de funcționalități cu SLComposeViewController. Pentru a înțelege mai bine UIActivityViewController
, îl puteți compara cu un oficiu poștal. Un oficiu poștal va lua mesajul dvs. și vă va asigura că este livrat la adresa (serviciul sau punctul final) specificat de dvs..
Unii dintre voi poate observa că are o asemănare cu biblioteca open source cunoscută ShareKit. UIActivityViewController
este mult mai puternic, deoarece se integrează fără probleme cu sistemul de operare și serviciile sale. Cu toate acestea, ca și în cazul ShareKit, dezvoltatorii pot adăuga puncte finale personalizate la o serie de puncte finale UIActivityViewController
se integrează cu și afișează utilizatorului.
Utilizarea UIActivityViewController
este la fel de simplu ca și utilizarea SLComposeViewController. Initializatorul desemnat al UIActivityViewController
are doi parametri, (1) articole de activitate și (2) activități de aplicare. Ambele argumente trebuie să fie instanțe ale NSArray. Primul parametru este o serie de obiecte de date pe care doriți să le partajați. Matricea poate include unul sau mai multe fragmente de text sau doar o singură imagine. Tipul de conținut pe care îl puteți partaja depinde nu numai de tipul de date pe care îl poate furniza aplicația dvs., dar și de tipul de date acceptat de punctul final. UIActivityViewController
clasa se va asigura că obiectele de date sunt procesate corect, în funcție de serviciul sau punctul final pe care îl alege utilizatorul.
Al doilea parametru, activitățile de aplicare, este o gamă de servicii sau puncte finale UIActivityViewController
va prezenta utilizatorului. Serviciile includ e-mail, Twitter, Facebook, tipărirea sau copierea a ceva în clipboard. După cum am menționat mai devreme, dezvoltatorii au opțiunea de a adăuga și servicii. Dacă activitățile aplicației sunt setate la zero, sistemul de operare va utiliza setul implicit de activități ale aplicației.
După prezentarea UIActivityViewController
exemplu către utilizator, UIActivityViewController
va avea grijă de restul. De exemplu, dacă ați adăugat Twitter ca activitate de aplicație, UIActivityViewController
va verifica mai întâi dacă Twitter este disponibil și dacă utilizatorul a instalat un cont Twitter pe dispozitivul său înainte să îl prezinte ca o opțiune pentru utilizatorul final. UIActivityViewController
vă salvează multe dureri de cap și durează doar câteva linii de cod pentru a se integra cu o aplicație.
Pentru a ilustra cât de ușor este de utilizat UIActivityViewController
și SLComposeViewController
, vom construi o aplicație simplă pentru shoebox pentru a împărtăși fotografiile. Aplicația permite utilizatorilor să creeze o imagine, să adauge o legendă și să o împărtășească prietenilor și familiei. Aplicația de probă vă va arăta cât de ușor este să distribuiți dinamic conținut în iOS 6.
Începeți prin crearea unui nou proiect în Xcode. Selectează Vizualizare individuală șablon din lista de șabloane (figura 3). Denumiți aplicația dvs. Sharetastic, introduceți numele companiei și identificatorul, setați iPhone pentru familia de dispozitive și verificați Utilizați numărarea automată a referințelor. Debifați casetele de validare rămase pentru acest proiect (figura 4). Specificați unde doriți să salvați proiectul și faceți clic pe Crea buton.
Întrucât aplicația noastră va profita de cadrul Social, trebuie să o adăugăm la proiectul nostru. Selectați proiectul din Project Navigator și selectați ținta din dreapta (figura 5). Selectează Construiți faze în partea de sus, deschideți Link binar cu biblioteci sertar, faceți clic pe butonul plus și alegeți Social.framework din listă (figura 5). Proiectul nostru este acum legat cu succes de cadrul social.
Nu uitați să adăugați o declarație de import în partea de sus a fișierului de antet al controlorului nostru de vizualizare pentru a importa anteturile cadrului social în proiectul dvs..
#import#import
Înainte de a crea interfața de utilizator a aplicației, trebuie să adăugăm primele și acțiunile necesare fișierului antet al controlerului nostru de vizualizare. Trebuie adăugate în total patru puncte de lucru, a UITextField
pentru introducerea legendei imaginii, a UIImageView
care afișează imaginea cedată și două UIButton
instanțe. Apăsând pe primul buton, imaginea și captura vor fi trimise în contul de utilizator al utilizatorului Facebook. Apăsând pe al doilea buton, apare o instanță de UIActivityViewController
, prezentând utilizatorului o serie de opțiuni pentru partajarea imaginii și a subtitrării. După cum probabil ați ghicit, fiecare buton este legat de un buton IBAction
. Fragmentul de cod de mai jos arată cum ar trebui să arate fișierul antet al controlorului nostru de vizualizare:
#import#import @interface RPViewController: UIViewController @property (slab, nonatomic) IBOutlet UITextField * captionTextField; @property (slab, nonatomic) IBOutlet UIImageView * imageView; @property (slab, nonatomic) IBOutlet UIButton * facebookButton; @property (slab, nonatomic) IBOutlet UIButton * shareButton; - (IBAction) facebook: (id) expeditor; - (IBAction) parts: (id) expeditor; @Sfârșit
Este timpul să ne îndreptăm spre fișierul XIB al controlorului nostru de vedere. Pentru a păstra lucrurile simple, nu vom mai utiliza noile funcții iOS 6 Autolayout în acest capitol. Cu fișierul XIB al controlerului de vizualizare selectat, deschideți Inspector de dosar din dreapta și debifați Utilizați Autolayout Caseta de bifat.
Cu fișierul XIB al controlerului de vizualizare selectat, porniți prin tragerea unui câmp de text în vizualizarea controlerului de vizualizare și poziționați-l chiar în partea de sus a ecranului (figura 6). Configurați câmpul de text deschizând Atribuții Inspector și schimbați textul său de substituent Introduceți subtitrare. Cu câmpul de text selectat încă, deschideți Conectarea inspectorului și conectați câmpul de text delega ieșire la Proprietarul dosarului obiect în stânga. Aceasta înseamnă că controlerul de vizualizare va acționa ca delegatul câmpului de text. Motivul pentru a face acest lucru va deveni clar în doar câteva minute. Asigurați-vă că ați conectat de asemenea captionTextField
ieșiți la obiectul de text pe ecran.
Trageți o instanță a UIImageView
de la bibliotecă până la vizualizarea controlerului și poziționați-o sub câmpul de text (figura 6). Modificați dimensiunile sale la 280 de puncte cu 280 de puncte. Deschide Atribuții Inspector încă o dată și modificați modul de afișare a imaginii (modul de conținut
) proprietate la Aspect Fit și asigurați-vă că verificați Interacțiunea cu utilizatorul activată. Aceasta din urmă este importantă deoarece vom adăuga în scurt timp un afișaj cu gest de atingere. Dacă nu permitem interacțiunea utilizatorilor pentru vizualizarea imaginilor, recunoașterea gestului de atingere nu va funcționa. Nu uitați să conectați priza controlerului de vizualizare cu imaginea noastră. Cea mai ușoară modalitate de a face acest lucru este apăsarea butonului Ctrl
, glisând din vizualizarea de imagini la obiectul Proprietarul fișierului și selectând priza corespunzătoare.
Pentru a finaliza interfața cu utilizatorul, adăugați două UIButton
instanțe în vederea vizualizării controlerului nostru și să le poziționăm sub vizualizarea imaginii (figura 6). Dați butonul de sus un titlu de Facebook și butonul din partea de jos un titlu Acțiune. Conectați prizele rămase așa cum am descris mai sus. În plus, conectați cele două acțiuni ale controlerului nostru de vizualizare apăsând tasta Ctrl, tragând de la obiectul Proprietății fișierului la fiecare buton și apoi selectând acțiunea corespunzătoare. Interfața cu utilizatorul este gata. Acum este momentul să începeți să scrieți un cod pentru a face totul de lucru!
Există încă un lucru pe care trebuie să-l adăugăm la fișierul de antet al controlorului nostru. Din moment ce vom folosi UIImagePickerController
pentru a fixa imagini, controlerul nostru de vizualizare trebuie să se conformeze ambelor UINavigationControllerDelegate
și UIImagePickerControllerDelegate
protocoale. În plus, așa cum am menționat cu câteva momente în urmă, controlorul nostru de vizualizare va acționa, de asemenea, ca delegat al câmpului de text al legendei. Aceasta înseamnă că controlerul de vizualizare trebuie să se conformeze UITextFieldDelegate
și protocolul. Uitați-vă la fișierul antet actualizat al controlorului nostru de vizualizare pentru clarificare.
#import#import @interface RPViewController: UIViewController @property (slab, nonatomic) IBOutlet UITextField * captionTextField; @property (slab, nonatomic) IBOutlet UIImageView * imageView; @property (slab, nonatomic) IBOutlet UIButton * facebookButton; @property (slab, nonatomic) IBOutlet UIButton * shareButton; - (IBAction) facebook: (id) expeditor; - (IBAction) parts: (id) expeditor; @Sfârșit
Din punctul nostru de vedere, vom începe să extinem definiția clasei și să adăugăm o proprietate privată. Este o bună practică să nu expuneți fiecare proprietate a unei clase, declarându-i în fișierul antet, iar modul în care se face acest lucru este extinderea definiției clasei în fișierul de implementare. După prima declarație de import și înainte de @implementation
, adăugați fragmentul de cod de mai jos pentru a declara o proprietate privată nouă. Proprietatea va conține o referință la imaginea pe care utilizatorul o fixează cu camera aparatului.
@interface RPViewController () @property (puternic, nonatomic) UIImage * imagine; @Sfârșit
O caracteristică frumoasă a Xcode 4.4+ este că nu mai trebuie să sintetizați accesoriile de proprietate. Acest lucru este făcut pentru dvs. în spatele scenei și urmează convențiile de numire ale Apple. În exemplul nostru, va fi creată o variabilă de instanță cu numele de _imagine
și accesoriile pentru proprietatea imaginii noastre sunt sintetizate automat pentru noi.
Îmi place întotdeauna să încep prin implementarea ciclului de viață al vizualizării unui controler de vizualizare. În plus, prefer să păstrez viewDidLoad
metoda scurtă prin adăugarea unor metode de ajutor. O metodă pe care o creez aproape întotdeauna este setupView
, care are grijă de configurarea și configurarea vizualizării controlerului de vizualizare. Să aruncăm o privire la viewDidLoad
și setupView
metode pentru a obține o idee despre ceea ce vreau să spun.
- (vid) viewDidLoad [super viewDidLoad]; // Afișare configurare [self setupView]; - (void) setupView // Adaugă Gesture Recognizer UITapGestureRecognizer * tgr = [[UITapGestureRecognizer alocare] initWithTarget: acțiunea de sine: @selector (takeImage :)]; [self.imageView addGestureRecognizer: tgr]; // Actualizare Vizualizare [self updateView];
După cum puteți vedea, setupView
metoda nu este complexă. Adăugăm un recunoaștere a gestului de atingere în vizualizarea imaginii, astfel încât utilizatorul să poată prinde o imagine atingând vizualizarea de imagini din interfața noastră de utilizator. Inițializăm mai întâi un dispozitiv de recunoaștere a gesturilor de robinet și apoi îl adăugăm în vizualizarea noastră de imagini. Recunoașterea gestului de atingere trimite mesajul snapImage:
la controlerul nostru de vizualizare atunci când utilizatorul pune pe ecran imaginea. Vom arunca o privire la snapImage:
în doar o secundă.
La sfârșitul setupView
, invocăm metoda updateView. Din nou, aceasta este o metodă de ajutor pe care o folosesc foarte des, deoarece îmi permite să grupez logica asociată actualizării vederii. Să aruncăm o privire rapidă la updateView
metodă.
- (void) updateView BOOL sharingEnabled = auto.image? DA NU; float shareAlpha = sharedEnabled? 1,0: 0,5; self.facebookButton.enabled = sharingEnabled; self.facebookButton.alpha = sharingAlpha; self.shareButton.enabled = sharingEnabled; self.shareButton.alpha = sharingAlpha;
După cum indică numele metodei, metoda doar actualizează vizualizarea și subdiviziuni. Începem cu verificarea dacă o imagine este disponibilă, verificând dacă proprietatea imaginii este setată. Dacă avem o imagine la care să lucrăm, activam butoanele Facebook și partajați și setăm valorile lor alfa la 1.0. Dacă o imagine nu este disponibilă, adică utilizatorul nu a luat încă una, dezactivați ambele butoane și le facem ușor transparente pentru a indica utilizatorului că butoanele sunt dezactivate.
Profitând de UIImagePickerController
, snapping imaginile este un proces simplu și simplu. Să începem prin examinarea snapImage:
care este invocată de către recunoașterea gestului de atingere atunci când utilizatorul pune pe ecran imaginea. În primul rând, un exemplu de UIImagePickerController
este inițializată și delegatul său este setat la sine, adică la controlorul nostru de vedere. Apoi, întrebăm sistemul de operare dacă o cameră este disponibilă prin apelare isSourceTypeAvailable
pe UIImagePickerController
clasă și trecând-o UIImagePickerControllerSourceTypeCamera
ca argument. Pe baza valorii returnate, setăm tipul sursei noastre UIImagePickerController
instanță. Ca defecțiune, tipul sursei este setat la UIImagePickerControllerSourceTypePhotoLibrary
dacă nu există nicio cameră pentru orice motiv. Aceasta înseamnă că utilizatorul poate selecta o imagine din biblioteca foto a dispozitivului. În cele din urmă, controlerul de selectare a imaginii este prezentat utilizatorului.
- (void) takeImage: (UITapGestureRecognizer *) tgr // Inițializează controlerul de selectare a imaginii UIImagePickerController * ip = [[UIImagePickerController alloc] init]; // Setați Delegați [ip setDelegate: self]; dacă [[UIImagePickerController esteSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) // Setați tipul sursei în Camera [ip setSourceType: UIImagePickerControllerSourceTypeCamera]; altceva // Setați tipul sursei în Biblioteca foto [ip setSourceType: UIImagePickerControllerSourceTypePhotoLibrary]; // Controler vizualizare prezent [self presentViewController: animat ip: completare DA: nil];
Puteți ghici ce este următorul pas? Trebuie să implementăm metodele UIImagePickerControllerDelegate
protocol. Protocolul are două metode, imagePickerController: didFinishPickingMediaWithInfo:
și imagePickerControllerDidCancel:
. Lasă-mă să te trec prin fiecare metodă.
În imagePickerController: didFinishPickingMediaWithInfo:
, începem prin stocarea unei referințe la imaginea originală, needitată. În următoarele câteva linii de cod, atribuim imaginea originală proprietății imaginii noastre și actualizăm vizualizarea. Rețineți că acest lucru va permite butoanele Facebook și partajare. În cele din urmă, eliminăm controlerul de selectare a imaginilor.
- (void) imagePickerController: (UIImagePickerController *) selectorul didFinishPickingMediaWithInfo: (NSDictionary *) info UIImage * originalImage = [info objectForKey: UIImagePickerControllerOriginalImage]; dacă (originalImage) self.image = originalImage; // Actualizare Vizualizare [self updateView]; // Înlăturați controlerul de selectare a imaginii [self dismissViewControllerAnimated: YES completion: nil];
A doua metodă de delegat conține doar o singură linie de cod. Dacă utilizatorul întrerupe butonul de anulare, controlerul de selectare a imaginilor este respins fără alte modificări.
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker // Renunțați la controlerul de selectare a imaginii [self dismissViewControllerAnimated: YES completion: nil];
Înainte de implementarea Facebook:
și acțiune:
acțiuni, vreau să fac o mică ocolire. De ce nu l-am atribuit imaginea recentă în imagine proprietății imaginii din imagine? Atribuirea imaginii recent rupte la proprietatea imaginii imaginii noastre este într-adevăr o opțiune perfect viabilă, dar am luat o altă abordare. De la introducerea @sintetiza
directivă, oamenii uită adesea cât de utile pot fi cei care stabilesc și primesc. Permiteți-mi să explic ce vreau să spun cu un exemplu.
În aplicația noastră de eșantion, am înlocuit setterul proprietății imaginii controlerului nostru. Acest lucru îmi permite să (1) grupeze codul asociat într-o singură locație și (2) să actualizeze vizualizarea imaginilor numai când se modifică imaginea. Acest lucru ar putea părea ca un detaliu cu foarte puțină utilizare în acest moment, dar vă arată cum putem începe deja să optimizăm codul nostru în moduri subtile, ceea ce va afecta lizibilitatea codului și chiar performanța. În acest exemplu, acesta nu va afecta performanța aplicației noastre, dar este bine să folosiți cele mai bune practici ori de câte ori considerați necesar.
Adăugați următoarele în fișierul de implementare acum:
- (void) setImage: (UIImage *) imagine if (_image! = imagine) _image = imagine; // Actualizare imagine Vizualizare auto.imageView.image = _image;
Înainte de a putea începe partajarea imaginilor, trebuie să implementăm o metodă delegată a UITextFieldDelegate
protocol, adică, textFieldShouldReturn:
. În această metodă de delegat, noi renunțăm la câmpul de text ca prim răspuns dacă utilizatorul pune butonul de întoarcere al tastaturii. Aceasta va elimina tastatura și va dezvălui butoanele de distribuire sub ea.
- (BOOL) textFieldShouldReturn: (UITextField *) textField // Demisia primului respondent [textField resignFirstResponder]; reveniți DA;
Este timpul să ne murdărim mâinile cu cadrul social și UIActivityViewController
. Să începem prin implementarea Facebook:
metodă. Acesta va ilustra modul de utilizare SLComposeViewController
. Uitați-vă la implementarea de mai jos și lăsați-o să o descompune pas cu pas.
- (IBAction) facebook: (id) expeditorul if ([SLComposeViewController isAvailableForServiceType: SLServiceTypeFacebook]) // Inițializați Controle View View SLComposeViewController * vc = [SLComposeViewController composeViewControllerForServiceType: SLServiceTypeFacebook]; // Configurează Controle View View [vc setInitialText: self.captionTextField.text]; [vc addImage: auto.image]; // Prezentare Compose View Controller [auto prezentViewController: vc animat: DA finalizare: nil]; altfel NSString * message = @ "Se pare că nu putem vorbi cu Facebook în acest moment sau nu ați adăugat încă contul dvs. Facebook la acest dispozitiv. Accesați aplicația Setări pentru a adăuga contul dvs. Facebook la acest dispozitiv."; UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @ Mesaj "Oops": delegat mesaj: null cancelButtonTitle: @ "OK" otherButtonTitles: nil]; [alertView show];
După cum am menționat mai devreme, este necesar să începeți prin a cere sistemului de operare dacă serviciul pe care îl vizăm este disponibil. Dacă isAvailableForServiceType:
se intoarce NU
, afișăm o vizualizare de avertizare care îi spune utilizatorului care ar putea fi problema. Dacă serviciul este disponibil, cu toate acestea, vom inițializa o instanță de SLComposeViewController
prin invocarea metodei de clasă composeViewControllerForServiceType:
. Argumentul pe care îl trecem la metoda de clasă este SLServiceTypeFacebook
, care indică faptul că vizăm platforma Facebook.
Chiar dacă utilizatorul nostru poate modifica mesajul înainte de a-l trimite pe Facebook, vom popula mesajul cu conținutul câmpului de text al legendei și vom atașa imaginea cronologică la mesaj. În cele din urmă, prezentăm controlerul de vizualizare a compunului către utilizator. Apoi este de datoria utilizatorului să editeze, să anuleze sau să posteze mesajul. Utilizatorul este în control. Acest lucru este important de reținut mai ales cu capitolul următor, în care utilizatorul nu va ști întotdeauna ce face aplicația noastră în spatele scenei. În această etapă, aplicația noastră este pregătită pentru testare. Construiți și rulați aplicația pe un dispozitiv de testare și încercați-o pentru dvs.!
După cum am menționat mai devreme, unul dintre punctele forte ale cadrului Social este cât de ușor este înlocuirea unei rețele sociale cu alta prin schimbarea tipului de serviciu. Să încercăm asta înlocuind cele două instanțe SLServiceTypeFacebook
cu SLServiceTypeTwitter
. Cu această schimbare simplă, acum putem împărtăși imaginile noastre cu adepții Twitter.
Cererea noastră nu este încă finalizată. Încă mai trebuie să punem în aplicare acțiune:
metodă. În această metodă, facem uz de UIActivityViewController
pentru a împărtăși imaginea snapped și legenda asociată. Uitați-vă la implementarea metodei de mai jos.
- (IBAction) parts: (id) expeditor // Elemente de activitate UIImage * image = self.image; NSString * caption = auto.captionTextField.text; NSArray * activityItems = @ [imagine, caption]; // Inițializează controlerul de vizualizare a activității UIActivityViewController * vc = [[UIActivityViewController alin] initWithActivityItems: activityItems applicationActivities: nil]; // Controlul vizualizării activității prezente [self presentViewController: vc animat: DA finalizat: nil];
Păstrează mai întâi imaginea și captura într-un matrice. Imaginea și captura sunt așa-numitele activityItems
, care sunt transmise ca argument pentru inițializatorul desemnat al lui UIActivityViewController
. Este important să treceți mai întâi imaginea și apoi legenda. Poți ghici de ce?
Frumusetea UIActivityViewController
este că știe cum să se ocupe de obiectele de date din matricea elementelor de activitate. Acest lucru va deveni mai clar atunci când testați funcționalitatea partajării. Al doilea parametru al metodei de inițializare este o matrice care conține serviciile pe care do