IOS SDK Tilpassede delegater

Delegater er et nyttig verktøy for å kommunisere mellom objekter. I denne opplæringen vil vi opprette og implementere en tilpasset delegat for å tillate tre UISliders å justere bakgrunnsfargen til a ViewController.


Om Delegates

Meldinger i Objective-C er en enveiskanal. En foreldersklasse kan sende en melding til barnet sitt, men barnet kan ikke alene sende en melding til sin forelder. Men med hjelp av en delegat kan toveiskommunikasjon oppnås. UIScrollView og UITableView Bruk delegater rutinemessig til å kommunisere mellom modell, visning og kontroller. Det er mange grunner til at delegatemønsteret er nyttig. En delegat kan brukes til å gjøre et objekt gjenbrukbart, for å gi en fleksibel måte å sende meldinger, eller for å implementere tilpasning.


Trinn 1: Opprett et nytt prosjekt

Start Xcode og klikk på File> New> Project. Velg et iOS enkeltvisningsprogram og klikk på "Neste". Navngi produktet ditt "Delegates" og skriv inn et navn for firmaidentifikatoren, for eksempel "com.companyName.delegates." Velg iPhone-enheten, og klikk på "Neste". Velg et sted for å lagre prosjektet ditt og klikk "Opprett".


Trinn 2: Subclassing UISlider

Klikk på File> New> File og velg en Cocoa Touch Objective-C klasse. Gi klassen din "MTSlider" og velg UISlider fra rullegardinmenyen "Underklasse". Klikk på "Next", og klikk deretter "Create."


Trinn 3: Legge til de delegerte protokollmetodene

Først må vi deklarere metodene for delegaten. Klikk på "MTSlider.h." Skriv inn følgende kode over grensesnittet.

 @ klasse MTSlider; @protocol MTSliderDelegate  @optional - (void) MTSliderDidChange: (MTSlider *) MTSlider withValue: (CGFloat) verdi; @required - (CGFloat) startposisjonForMTSlider: (MTSlider *) MTSlider; @slutt

Compiler Direktiv

Legg merke til linjen @ klasse MTSlider. Ved å plassere denne koden over alt annet, blir kompilatoren informert om at det på et eller annet tidspunkt ligger nedover linjen, MTSlider vil bli erklært. Uten dette compiler-direktivet vil kompilatoren gi deg en advarsel fordi den forventer å finne grensesnittet for MTSlider med en gang.

Deklarere de delegerte metodene

Deleguttens metoder erklæres å begynne med @protocol. Protokollen MTSliderDelegate samsvarer med NSObject protokoll av en bestemt grunn. De NSObject protokollen inneholder en metode, respondsToSelector:, som kan brukes til å sikre at delegatobjektet faktisk implementerer en valgfri metode før metoden kalles. Å ringe en metode som ikke er implementert av delegatobjektet, vil føre til at et program krasjer.

Valgfri metode

Vanligvis er en valgfri metode en metode som ikke må implementeres av delegatobjektet; i dette tilfellet vil delegatobjektet være ViewController, men det kan være noe objekt. Den valgfrie metoden MTSliderDidChange: withValue: Sendes i delegatobjektet når glidebryterens verdi endres.

Påkrevd metode

På den annen side er en nødvendig metode en metode som må implementeres av delegatobjektet, ellers får du en kompilervarsel. Den nødvendige metoden startPositionForMTSlider: spør delegatobjektet der glidebryterne skal starte og får sin startposisjonsverdi i retur fra delegaten.

Opprette en instansvariabel for delegat

Fortsatt i "MTSlider.h," skriv inn følgende kode direkte under @interface å erklære en instansvariabel, eller ivar, for delegaten.

 id  sliderDelegate;

Hvis du bruker ARC, skriv inn følgende kode i stedet:

 __weak id  sliderDelegate;

Ivar er av typen id så det er fleksibelt og kan akseptere enhver objekttype. Den neste delen, MTSliderDelegate sier at uansett gjenstand blir tildelt til sliderDelegate vil inneholde protokollmetodene til MTSliderDelegate som en del av sin egen gjennomføring.

Opprette Setters og Getters

Avslutt ved å syntetisere setter og getter metoder. Skriv inn følgende kode like under instansvariabelens lukkebøyle.

 @property (nonatomic, assign) id  sliderDelegate;

Hvis du bruker ARC, skriv inn følgende kode i stedet:

 @property (nonatomic, weak) id  sliderDelegate;

Klikk på "MTSlider.m" og skriv inn følgende kode nedenfor @gjennomføring å fullføre eiendommen.

 @synthesize sliderDelegate;

Trinn 4: I samsvar med de delegerte protokollmetodene

Klikk på "ViewController.h" -filen. Skriv inn følgende kode for å passe til MTSliderDelegate protokoll og import "MTSlider.h."

 #import "MTSlider.h" @interface ViewController: UIViewController 

Implementere de delegerte protokollmetodene

Klikk på "ViewController.m" -filen og skriv inn følgende kode for å implementere MTSliderDelegate protokollmetoder.

 - (CGFloat) startPositionForMTSlider: (MTSlider *) MTSlider  - (void) MTSliderDidChange: (MTSlider *) MTSlider medValue: (CGFloat) verdi 

Trinn 5: Stille inn delegat

Tilpasset Initializer

Å skape en tilpasset initialiserer er nøkkelen til å få startposisjonen for skyvekontrollene. I "MTSlider.h," legg til følgende kode for å deklarere den nye initialisatoren.

 - (id) initWithFrame: (CGRect) ramme og Delegate: (id) DelegateObject;

Klikk på "MTSlider.m" og se etter initWithFrame: metode. Slett den eksisterende metoden og erstatt den med følgende kode.

 - (id) initWithFrame: (CGRect) ramme og Delegate: (id) delegateObject self = [super initWithFrame: frame]; hvis (selv) self.sliderDelegate = delegateObject; self.value = [sliderDelegate startPositionForMTSlider: self];  returner selv; 

Innstilling av delegat under initialisering tillater delegertemetoden å bli umiddelbart kalt. Metoden startPositionForMTSlider: får startplasseringen for glidebryterne. Fordi det kalles i initialisatoren, settes skyveposisjonene før de trekkes på skjermen.

Overstyre UISlider Metode

De UISlider metode SetValue: animerte: kalles automatisk hver gang en skyvepinne blir flyttet. Fortsatt i filen "MTSlider.m", legg til følgende metode.

 - (void) setValue: (float) verdi animert: (BOOL) animert [super setValue: verdi animert: animert]; hvis (sliderDelegate! = nil && [sliderDelegate respondsToSelector: @selector (MTSliderDidChange: withValue:)]) [[self sliderDelegate] MTSliderDidChange: self withValue: value]; 

Ved tvingende SetValue: animerte: hver gang en skyvepinne beveger seg, sendes en melding til delegatobjektet. Legg merke til samtalen til super, super setValue: animert:. Det er viktig at vi ikke ved et uhell roter opp noe metoden gjør bak kulissene når man overstyrer en eksisterende metode.

Delegemetoden MTSliderDidChange: withValue: er den valgfrie protokollmetoden deklarert tidligere. Delegatobjektet blir meldt hver gang skyvekontrollen endres. Husk at å ringe en metode som ikke er implementert vil føre til at programmet krasjer. ringe respondsToSelector: på delegatobjektet verifiserer det at det er greit å fortsette og beskrive den valgfrie delegatemetoden.


Trinn 6: Stille inn bakgrunnsfargen og Instantiere skyvekontrollene

Klikk på "ViewController.m" -filen og skriv inn følgende kode innvendig viewDidLoad for å angi bakgrunnsfargen til bakgrunnen med fire fargekomponenter og instantiere den røde, grønne og blåen MTSlider objekter. Hvis du bruker ARC, sørg for å fjerne linjene [redSlider release];, [greenSlider release];, og [blueSlider release]; da disse anropene ikke er nødvendige.

 CGFLOAT sliderColorPosition = 0,3f; self.view.backgroundColor = [UIColor colorWithRed: sliderColorPosition green: sliderColorPosition blue: sliderColorPosition alpha: 1.0f]; CGRect redSliderFrame = CGRectMake (20.0f, 20.0f, 280.0f, 28.0f); MTSlider * redSlider = [[MTSlider alloker] initWithFrame: redSliderFrame andDelegate: self]; redSlider.tag = 1; [self.view addSubview: redSlider]; [redSlider release]; CGRect greenSliderFrame = CGRectMake (20.0f, 70.0f, 280.0f, 28.0f); MTSlider * greenSlider = [[MTSlider alloker] initWithFrame: greenSliderFrame andDelegate: self]; greenSlider.tag = 2; [self.view addSubview: greenSlider]; [greenSlider release]; CGRect blueSliderFrame = CGRectMake (20,0f, 120,0f, 280,0f, 28,0f); MTSlider * blueSlider = [[MTSlider alloker] initWithFrame: blueSliderFrame andDelegate: self]; blueSlider.tag = 3; [self.view addSubview: blueSlider]; [blueSlider release];

Ved å bruke egendefinert MTSlider initializer, initWithFrame: andDelegate:, Delegaten er satt og ViewController objekt blir delegatobjektet til hver skyveknapp. Normalt kan du forvente å se en delegat sett ved hjelp av følgende kode: redSlider.sliderDelegate = selv;. I dette tilfellet blir delegatoppdraget imidlertid passert inn under initialiseringen.

Merk at hver skyveknapps tagegenskap er innstilt. I utgangspunktet bakgrunnsfargen til ViewController er satt til mørkegrå. Når hver skyveknapp er justert, vil bakgrunnsfargen endres tilsvarende fordi taggen identifiserer hvilken skyvekontroll som er aktiv.


Trinn 7: Endre bakgrunnsfargen

Finn implementeringen av startPositionForMTSlider:, og skriv inn følgende kode inne i bøylene for å sette startverdien til skyvekontrollene til 0,3.

 CGFloat sliderStartPosition = 0.3f; returner sliderStartPosition;

Justere bakgrunnsfargen

Finn implementeringen av MTSliderDidChange: withValue:, og legg til følgende kode for å justere bakgrunnsfargen.

 hvis (MTSlider.tag == 1) // Red Slider CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentGreen = colorsPointer [1]; CGFloat currentBlue = colorsPointer [2]; self.view.backgroundColor = [UIColor colorWithRed: value green: currentGreen blue: currentBlue alpha: 1.0f];  hvis (MTSlider.tag == 2) // Green Slider CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentRed = colorsPointer [0]; CGFloat currentBlue = colorsPointer [2]; self.view.backgroundColor = [UIColor colorWithRed: currentRed green: value blue: currentBlue alpha: 1.0f];  hvis (MTSlider.tag == 3) // Blue Slider CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentRed = colorsPointer [0]; CGFloat currentGreen = colorsPointer [1]; self.view.backgroundColor = [UIColor colorWithRed: currentRed green: currentGreen blue: value alpha: 1.0f]; 

Hver gang skyvekontrollen endres, sendes en melding til delegatemetoden. Meldingen inneholder gjeldende MTSlider og dens verdi. Den nåværende skyvekontrollens tagegenskap er tilgjengelig for å bestemme hvilken skyvekontroll som sendte meldingen, og bakgrunnsfargen oppdateres tilsvarende.


Trinn 8: Testing av Delegaten

Klikk på Produkt> Kjør, eller klikk på pilen "Kjør" øverst til venstre for å se skyvekontrollene i handling. Juster glidebryterne for å se hvordan barnelementene kan kontrollere foreldralelementets bakgrunnsfarge.


Konklusjon

Det er mange andre måter å kontrollere bakgrunnsfargen til a UIViewController, inkludert mål eller varsler. Apple designet UISlider å bruke et målmønster for å sende data. Men hvis du vil legge til mer funksjonalitet, er den beste måten å kommunisere fra et barn til sin forelder, ved å opprette en tilpasset delegat.