Bygg den selv iOS Twitter-klient Del 3

Som nevnt i del II, for den siste delen av vår Twitter-app vil vi bygge MentionsViewController, som er omtrent den samme koden som vi brukte før i del II, men vi vil bruke en annen Twitter API-ressurs. Så kopier og lim inn koden fra PublicTimelineViewController-delen av prosjektet i MentionsViewController, og vi vil fikse klassenavnene der det er aktuelt.

MentionsViewController (2)

Er du klar for dette? Jeg håper du er en tålmodig gjeng - her går vi.

Endre denne linjen i getFeed:

 NSURL * feedURL = NSURL URLWithString: @ "http://api.twitter.com/1/statuses/home_timeline.json"; 

Til dette:

 NSURL * feedURL = NSURL URLWithString: @ "http://api.twitter.com/1/statuses/mentions.json"; 

Voila! Du er ferdig. Hvor kult er det? Nettjenester er bare fantastisk på den måten. Det er veldig enkelt å bare tilbakestille severdighetene, og du kan treffe en annen homerun, akkurat som det.

ProfileViewController (3)

La oss skifte ned og slappe av hjernen vår et øyeblikk. Dette vil vi gjøre ved å jobbe med en enkel visningskontroller, profilinformasjonen. Åpne storyboardet ditt og velg din ProfileViewController-scene for å designe noe som ser ut som figur A.

Figur A

Vi vil bruke dette til å vise statistikken vår, for eksempel antall tweets, favoritter, følgere osv. Du kan designe bakgrunnen slik du vil; Jeg brukte bare noen minimalistiske rektangler for å skille mellom utsnittene. La oss nå gå videre til koden.

Åpne opp ProfileViewController.h og legg til dette:

 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * brukernavn Etikett; 
 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * beskrivelse Etikett; 
 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * tweetsLabel; 
 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * favoritesLabel; 
 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * followingLabel; 
 @egenskap (svak, ikke-atomisk) IBOutlet UILabel * followersLabel; 
 Deretter implementerer dette i ProfileViewController.m dette: 
 @interface ProfileViewController () 
 @slutt 
 @implementation ProfileViewController 
 @synthesize brukernavn Etikett; 
 @synthesize descriptionLabel; 
 @synthesize tweetsLabel; 
 @synthesize favoritesLabel; 
 @synthesize followingLabel; 
 @synthesize followersLabel; 
 - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { 
 return (interfaceOrientation == UIInterfaceOrientationPortrait); 
 } 

Dette vil gi oss objektene vi trenger for bare å vise brukerens statistikk.

Nå implementerer vi ganske enkelt en privat metode for å få statistikken med riktig ressurs og befolke klasseobjektene våre. Når vi har implementert metoden (skriv den), kaller vi den fra en metode som heter viewWillAppear-metoden, slik:

 - (ugyldig) loadProfile { 
 // 1. Lagre URL i en variabel for senere bruk 
 NSURL * feedURL = NSURL URLWithString: @ "http://api.twitter.com/1/users/show.json"; 
 // 2. Få henvisning til AppDelegate 
 AppDelegate * appDelegate = UIA-applikasjon deltApplikasjon delegat; 
 // 3. Få brukerkonto og sett etiketten 
 self.usnameLabel.text = appDelegate.userAccount.username; 
 // 4. Opprett parametere dict 
 NSDictionary * parameters = NSDictionary dictionaryWithObjectsAndKeys: appDelegate.userAccount.username, @ "screen_name", nil; 
 // 5. Opprett forespørsel og pass i dict & URL via GET 
 TWRequest * twitterFeed = TWRequest alloc initWithURL: feedURL parameters: parameters requestMethod: TWRequestMethodGET; 
 // 6. Sett twitterønskes konto til appdelegatene våre 
 // twitterFeed.account = appDelegate.userAccount; 
 // 7. Legg til indikator på statuslinjen 
 UIApplication * sharedApplication = UIApplication sharedApplication; 
 sharedApplication.networkActivityIndicatorVisible = JA; 
 // 8. Utfør forespørsel 
 twitterFeed performRequestWithHandler: ^ (NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error) { 
 hvis (! feil) { 
 // 9. Ingen feil? Sett inn gjenstand 
 NSError * jsonError = null; 
 id feedData = NSJSONSerialization JSONObjectWithData: responseData-alternativer: 0 feil: & jsonError; 
 if (! jsonError) { 
 NSDictionary * profileDictionary = (NSDictionary *) feedData; 
 self.descriptionLabel.text = profileDictionary valueForKey: @ "description"; 
 self.favoritesLabel.text = profileDictionary valueForKey: @ "favourites_count" stringValue; 
 self.followersLabel.text = profileDictionary valueForKey: @ "followers_count" stringValue; 
 self.followingLabel.text = profileDictionary valueForKey: @ "friends_count" stringValue; 
 self.tweetsLabel.text = profileDictionary valueForKey: @ "statuses_count" stringValue; 
 } annet { 
 // 9.1 Hvis feil parsing JSON visningsfeil 
 UIAlertView * alertView = UIAlertView alloc 
 initWithTitle: @ "feil" 
 melding: jsonError localizedDescription delegat: nil 
 avbrytButtonTitle: @ "OK" otherButtonTitles: nil; 
 alarmView show; 
 } 
 } annet { 
 //9.2 Hvis du ber om mislykket visningsvarsel med feil 
 UIAlertView * alertView = UIAlertView alloc 
 initWithTitle: @ "Feil" -melding: feil lokalisert beskrivelse delegat: nil 
 avbrytButtonTitle: @ "OK" otherButtonTitles: nil; 
 alarmView show; 
 } 
 // 10. Stoppaktivitetsindikator 
 sharedApplication.networkActivityIndicatorVisible = NEI; 
 }; 
 } 

Nå kaller vi ganske enkelt den metoden fra en av våre Viewcontroller hook-metoder. De kalles hook-metoder fordi de lar deg koble deg til en eller annen hendelse i livssyklusen til visningskontrolleren for å utføre en spesifikk oppgave.

 - (void) viewWillAppear: (BOOL) animert { 
 self loadProfile; 
 } 

Koden er ganske godt kommentert som før. Mønsteret igjen er det samme som de forrige. Vi endrer ganske enkelt ressursen som brukes, og selvfølgelig informasjonen som er mottatt fra den ressursen.

FollowMeViewController (4)

For å fullføre vår Twitter-klient, ønsker vi å lage den mer enn bare en liste over tweetsene våre. La oss legge til noen UX-funksjonalitet som starter med et FollowMe-alternativ.

Se i Twitter API så finner du disse ressursene:

  • FÅ vennskap / eksisterer
  • POST vennskap / opprett
  • POST vennskap / ødelegge
Når du har lest dem, kan du gå videre til storyboardet ditt og designe dette utseendet. ( Figur B )

Figur B

FollowMeViewController

Jeg droppet bare en knapp på visningskontroller-scenen, la til et bilde i høyre rute og fylte ut teksten for den knappen. La oss nå koble den knappen og opprette en metode for den i FollowMeViewController. Legg til denne metoden i FollowMeViewController .h:

 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * textLabel; 
 - (IBAction) followTapped: (id) avsender; 

Ikke glem å koble etiketten til stikkontakten og den mottatte handlingen i storyboard.

La oss implementere .m-filen. Få først toppen av .m til å se slik ut:

 #import "FollowMeViewController.h" 
 #import "AppDelegate.h" 
 #importere 
 #define kAccountToFollow @ "santiapps" 
 @interface FollowMeViewController () 
 @ eiendom (tilordne) BOOL erFølger; 
 - (ugyldig) sjekkFølger; 
 @slutt 

Vi trenger en boolsk for å sjekke og se om vi allerede følger og en metode for å faktisk sjekke og sette etiketten. Ikke glem å syntetisere egenskapene:

 @synthesize textLabel = _textLabel; 
 @synthesize isFollowing = _isFollowing; 

Igjen må vi begrense orienteringen:

 - (BOOL) shouldAutorotateToInterfaceOrientation: 
 (UIInterfaceOrientation) interfaceOrientation { 
 return (interfaceOrientation == UIInterfaceOrientationPortrait); 
 } 

Greit! Nå er vi klare til å komme inn på noen Twitter API-anrop. Først vil vi sjekke om vi allerede følger en bruker eller ikke. Dette er en stor metode, men du vil merke at den er veldig lik den offentlige tidslinjesamtalen:

 - (ugyldig) sjekkFølger { 
 // 1. Lag en variabel for twitter 
 NSURL * feedURL = NSURL URLWithString: @ "http://api.twitter.com/1/ Friendships/exists.json"; 
 // 2. Få appDelegat-referanse 
 AppDelegate * appDelegate = UIA-applikasjon deltApplikasjon delegat; 
 // 3. Lag NSDictionary for TWR-parametrene 
 NSDictionary * parametere = 
 NSDictionary ordbokWithObjectsAndKeys: appDelegate.userAccount.username, @ "screen_name_a", kAccountToFollow, @ "screen_name_b", nil; 
 // 4. Lag TWRequest, med parametere, URL og spesifiser GET-metoden 
 TWRequest * twitterFeed = TWRequest alloc initWithURL: feedURL parameters: parameters requestMethod: TWRequestMethodGET; 
 // 5. Spesifiser twitter-forespørselens konto til app-delegatene våre 
 twitterFeed.account = appDelegate.userAccount; 
 // 6. Vis brukeraktivitet pågår 
 UIApplication * sharedApplication = UIApplication sharedApplication; sharedApplication.networkActivityIndicatorVisible = JA; 
 // 7. Utfør TWR 
 twitterFeed performRequestWithHandler: ^ (NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error) { 
 hvis (! feil) { 
 NSString * responseString = 
 NSString alloc initWithBytes: responsData-byte lengde: responsData-lengde koding: NSUTF8StringEncoding; 
 // 8. Sett etikettens tekst til følger eller ikke. 
 if (responseString isEqualToString: @ "true") 
 { 
 self.textLabel.text = 
 @ "Slutt å følge Santiapps"; 
 _isFollowing = JA; } 
 ellers 
 { 
 self.textLabel.text = 
 @ "Følg Santiapps"; 
 _isFollowing = NO; 
 } 
 } annet { 
 // 9. Hvis TWR ikke lykkes, vis varselvisning m / feil 
 UIAlertView * alertView = UIAlertView alloc 
 initWithTitle: @ "Feil" -melding: feil lokalisert beskrivelse delegat: nil 
 avbrytButtonTitle: @ "OK" otherButtonTitles: nil; 
 alarmView show; 
 } 
 // 10. Stoppaktivitetsindikator 
 sharedApplication.networkActivityIndicatorVisible = NEI; 
 }; 
 } 

Dette er en anmeldelse, så la oss gå litt raskt:

  • Vi oppretter en variabel for Twitter API-URL i json-format
  • Få en henvisning til AppDelegate for å kunne ringe på brukerkontoen
  • Lag vår ordbok med parametere for Twitter-samtalen
  • Opprett den faktiske Twitter-forespørselen
  • Spesifiser kontoen
  • Vis litt aktivitet som brukeren kan se
  • Utfør selve tunge løfteanropet
  • Angi en etikettverdi som skal vises hvis brukeren følger
  • Vis en advarsel hvis det var feil
  • Stopp UI-aktivitetsindikatoren

Nå er det bare å ringe denne metoden fra viewDidLoad ved å bruke:

 self checkFollowing; 

Så kommer vi inn på selve handlingen for hva de skal gjøre når brukeren trykker på følgeknappen. Igjen, dette vil være en ganske rask gjennomgang, fordi du kan se at metodestrukturen er veldig lik:

 - (IBAction) followTapped: (id) avsender { 
 // 1. Opprett url-variabel for json-samtale 
 NSURL * feedURL; 
 // 2. Kontroller om vi trenger en følg eller avslutter samtalen 
 if (_følger) { 
 feedURL = NSURL URLWithString: @ "http://api.twitter.com/1/ Friendships/destroy.json"; 
 } annet { 
 feedURL = NSURL URLWithString: @ "http://api.twitter.com/1/ Friendships/create.json"; 
 } 
 // 3. Få en henvisning til appens delegat 
 AppDelegate * appDelegate = UIA-applikasjon deltApplikasjon delegat; 
 // 4. Lag NSDictionary-parametere. 
 NSDictionary * parametere = 
 NSDictions ordbokWithObjectsAndKeys: @ "true", @ "follow", 
 kAccountToFollow, @ "screen_name", nil; 
 // 5. Opprett TWRequest 
 TWRequest * twitterFeed = TWRequest alloc initWithURL: feedURL 
 parametere: parameters requestMethod: TWRequestMethodPOST; 
 // 6. Sett brukeren til kontoen vår 
 twitterFeed.account = appDelegate.userAccount; 
 // 7. Vis UI-aktivitetsindikator 
 UIApplication * sharedApplication = UIApplication sharedApplication; sharedApplication.networkActivityIndicatorVisible = JA; 
 // 8. Utfør forespørsel 
 twitterFeed performRequestWithHandler: ^ (NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error) { 
 hvis (! feil) { 
 // 9. Angi etikettverdi. 
 if (! _ er følgende) 
 { 
 self.textLabel.text = 
 @ "Slutt å følge Santiapps"; 
 _isFollowing = JA; 
 } annet { 
 self.textLabel.text = 
 @ "Følg Santiapps"; 
 _isFollowing = NO; 
 } 
 } annet { 
 // 10. Vis feilvarsel hvis noen 
 UIAlertView * alertView = UIAlertView alloc initWithTitle: @ "Feil" 
 melding: feil lokalisert beskrivelse delegat: null 
 cancelButtonTitle: @ "OK" 
 otherButtonTitles: null; alarmView show; 
 } 
 // 11. Stopp indikator for nettverksaktivitet 
 sharedApplication.networkActivityIndicatorVisible = NEI; 
 }; 
 } 

All denne koden er ganske lik som vi har sett før, og den er som alltid ganske godt kommentert. Så la oss gå videre til en mer spennende oppgave.

TweetViewController

Denne visningskontrollerklassen vil ha omtrent den samme strukturen som vårt originale Twitter-prosjekt fra del I, men med litt lyd, for moro skyld.

Få din TweetViewController.h-fil til å se slik ut:

 #importere 
 #importere 
 @interface TweetViewController: UIViewController 
 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * vedlagt Etikett; 
 @ eiendom (svak, ikke-atomisk) IBOutlet UITextField * statusTextField; 
 @ eiendom (svak, ikke-atomisk) IBOutlet UILabel * successLabel; 
 - (IBAction) attachTapped: (id) avsender; 
 - (IBAction) tweetTapped: (id) avsender; 
 @slutt 

Her lager vi ganske enkelt et tekstfelt, en etikett for å vise om tweeten var vellykket, en annen etikett som skal vises når noe ble festet. Hvis du legger merke til, la jeg også til en import for AudioToolbox. Hvis du bare legger til importen, vil du få en feil. Dette er fordi vi ennå ikke har lagt til rammen. Så gå til Mål | Bygg faser | Koble binær med biblioteker og legg til AudioToolbox-rammeverket til prosjektet ditt.

La oss rette oppmerksomheten mot .m-filen og starte hvis den er slik:

 #import "TweetViewController.h" 
 #import "AppDelegate.h" 
 #importere 
 @interface TweetViewController () { 
 SystemSoundID lyd1; 
 } 
 @ eiendom (tilordne) BOOL er tilkoblet; 
 - (ugyldig) avvise tastaturet; 
 @slutt 

Vi importerer Twitter-rammeverket som alltid. I tillegg til det lager vi en ivar for en systemlyd. Husk at det er en ivar fordi bare denne klassen trenger å bruke den. Vi legger også til en metode for å avvise Keyboard, som du vil bruke når du er ferdig med å skrive tweeten din.

Legg til disse metodene til implementeringen av TweetViewController:

 - (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { 
 return (interfaceOrientation == UIInterfaceOrientationPortrait); 
 } 
 - (ugyldig) avviseTavle { 
 // Avslutt tastaturet hvis det er synlig når brukeren trykket på visningen. 
 if (self.statusTextField.isFirstResponder) { 
 self.statusTextField resignFirstResponder; 
 } 
 } 

Den viktige metoden her er avvisningstabellen. Vi sier i utgangspunktet at hvis tekstfeltet (der vi vil skrive tweeten vår) er den første responderen, så la den trekke seg som første responder. Denne metoden vil bli kalt fra tappemetoden vår, som vi implementerer neste. Når skjermen er tappet, vil tekstfeltet svare på første gang, og skjuler tastaturet. Dette er en fin funksjon å ha siden brukerne ikke ønsker å lete etter Return eller Enter-knappen hele tiden. De kan skrive tweeten sin og bare trykke på skjermen for å gjøre noe annet, som vedlegg en fil eller noe annet.

Vår viewDidLoad-metode er det som får ting til å rulle:

 - (ugyldig) viewDidLoad 
 { 
 super viewDidLoad; 
 // Sett vedlegg til NO, føre til en ny tweet vi ikke har en ennå 
 _is = = NEI; 
 // Bruk trykkbevegelsesgjenkjenning for å avvise tastaturet 
 UITapGestureRecognizer * tapRecognizer = UITapGestureRecognizer alloc initWithTarget: self action: @selector (removeKeyboard); 
 tapRecognizer.numberOfTapsRequired = 1; tapRecognizer.cancelsTouchesInView = NEI; 
 self.view addGestureRecognizer: tapRecognizer; 
 } 

Dette skal virke ganske greit. Vi setter vår isAttached ivar til NEI fordi vi ikke har et vedlegg når vi oppretter en ny tweet. Deretter oppretter vi en UITapGestureRecognizer for å kalle metoden removeKeyboard og angi noen av dens egenskaper. Til slutt legger vi gjenkjenneren til utsikten den vil ligge i.

La oss se på hva som skjer når du trykker på vedlegg-knappen:

 - (IBAction) attachTapped: (id) avsender { 
 // Hvis bildet er festet, må du fjerne det, tømme etiketten og endre BOOL til NO. Ellers satte vi vedlagt etikett og BOOL til JA. 
 hvis (_ er tilkoblet) 
 { 
 self.attachedLabel.text = @ ""; 
 _is = = NEI; 
 } annet { 
 self.attachedLabel.text = @ "Vedlegg"; 
 _isAchedched = JA; 
 } 
 } 

Ok nå videre til tunge løft. Dette bør imidlertid være en lek nå som du har så god kunnskap om denne typen metoder:

 - (IBAction) tweetTapped: (id) avsender {self.successLabel.text = @ ""; 
 // 1. Opprett URL-variabel 
 NSURL * feedURL; 
 // 2. Hvis isAttached er sant, bruk update_with_media-anropet, ellers vanlig oppdateringsanrop. 
 hvis (_ er tilkoblet) 
 { 
 feedURL = NSURL URLWithString: @ "https://upload.twitter.com/1/statuses/update_with_media.json"; 
 } 
 ellers 
 { 
 feedURL = NSURL URLWithString: @ "http://api.twitter.com/1/statuses/update.json"; } 
 // 3. Lag vår Tw Dictionary 
 NSDictionary * parameters = NSDictionary dictionaryWithObjectsAndKeys: self.statusTextField.text, @ "status", @ "true", @ "wrap_links", nil; 
 // 4. Opprett TWRequest 
 TWRequest * twitterFeed = TWRequest alloc initWithURL: feedURL parameters: parameters requestMethod: TWRequestMethodPOST; 
 // 5. Hvis isAched, legg den til i TWRequest vår 
 hvis (_ er tilkoblet) { 
 twitterFeed addMultiPartData: UIImagePNGRepresentation (UIImage imageNAME: @ "TweetImage.png") withName: @ "media" type: @ "image / png"; 
 twitterFeed addMultiPartData: self.statusTextField.text dataUsingEncoding: NSUTF8StringEncoding withName: @ "status" type: @ "text / plain"; 
 } 
 // 6. Få app-delegaten 
 AppDelegate * appDelegate = UIA-applikasjon deltApplikasjon delegat; 
 // 7. Angi TWRequest-brukerkontoen 
 twitterFeed.account = appDelegate.userAccount; 
 // 8. Aktiver indikator 
 UIApplication * sharedApplication = UIApplication sharedApplication; sharedApplication.networkActivityIndicatorVisible = JA; 
 // 9. Sett _Attached BOOL til NO og vedlagt etikett 
 _is = = NEI; 
 self.attachedLabel.text = @ ""; 
 // 10. Utfør TWRequest 
 twitterFeed performRequestWithHandler: ^ (NSData * responseData, NSHTTPURLResponse * urlResponse, NSError * error) { 
 hvis (! feil) 
 { 
 self.successLabel.text = @ "Tweetet vellykket"; 
 // 11.Placeholder J 
 self.statusTextField.text = @ "..."; 
 } annet { 
 // 12. I tilfelle mislykket TwRequest, vis varselvisning 
 UIAlertView * alertView = UIAlertView alloc initWithTitle: @ "Feil" -melding: feil localizedDescription delegat: nul CancelButtonTitle: @ "OK" otherButtonTitles: nil; 
 alarmView show; 
 } 
 // 13.Stoppindikator 
 sharedApplication.networkActivityIndicatorVisible = NEI; 
 }; 
 } 

Tanken her er å bore deg med en ikke så annen metode, slik at du blir vant til bruken av disse metodeanropene for å se hvordan og hvor du kan endre parametere.

oppsummering

Så bare for å sammenfatte, lager vi en hvis / ellers test for å bruke en annen URL basert på hva vi trenger å tweet. Vi lager deretter ordboken over parametere og TWRequest som før. Hvis det er et vedlegg, legger vi det til forespørselen. Igjen får vi vår Twitter-konto via appDelegate. Vi setter de lokale variablene for tilknytning og merking tilbake til sin opprinnelige tilstand. Endelig utfører vi vår Twitter-forespørsel som før.

Og så tilsetter vi litt sukker og krydder:

 - (void) playTweetSound { 
 // trenger også en forekomstvariabel slik: 
 // SystemSoundID lyd1; 
 NSLog (@ "playingtweetsound"); 
 NSURL * soundURL = NSBundle mainBundle URLForResource: @ "Cardinal" withExtension: @ "wav"; 
 AudioServicesCreateSystemSoundID ((__ bridge CFURLRef) soundURL, & sound1); 
 AudioServicesPlaySystemSound (SOUND1); 
 } 

Denne metoden skaper et lydobjekt for oss å spille. Gå videre og kjør appen din!

Vent, hva, det tweetet ikke !? Beklager, jeg gjorde dette med vilje for å få oppmerksomheten rundt noe. Når du skal kode, blir du fanget opp i å utforme hva en metode skal gjøre. Ofte glemmer vi å faktisk kalle selve metoden, og konsollen sier ingenting, fordi det faktisk ikke er noe galt. Så gå tilbake til twitter-forespørselsmetoden og erstatt linjen jeg merket som // plassholder med denne:

 self playTweetSound; 

Voila! Nå har vi en komplett Twitter-klient. Håper du likte det. Ikke glem å legge inn kommentarer eller spørsmål du måtte ha.

Les også:

  • Bygg den selv iOS Twitter-klient Del 1
  • Bygg den selv iOS Twitter-klient Del 2

© Copyright 2021 | pepebotifarra.com