Archiv Dezember 2009

Objective-C: Setzen Sie Eigenschaften in einer Klasse

Ich möchte zeigen, und zeigt einige Beispiele, wie man hinzufügen und manipulieren Eigenschaften in Objective-C-Klasse. : Ein klassisches Beispiel, genau, ist wie folgt: bei der Definition der Schnittstelle unserer Klasse definieren wir zwei Eigenschaften nome und cognome :

1
2
3
4
5
6
7
8
9
10
11
/ / MyClass.h
# Import <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
nome; NSString * name;
cognome; NSString * name;
}

retain ) NSString * nome; @ Property (behalten) NSString * name;
retain ) NSString * cognome; @ Property (behalten) NSString * name;
@ End

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: In der Implementierung-Datei fügen wir die Anweisung @synthesize so dass Xcode für uns produzieren wird den Methoden getter -und setter bzw. verwendet werden, um lesen und setzen unsere zwei Eigenschaften:

1
2
3
4
5
6
7
8
/ / MyClass.m
# Import "MyClass.h"

@ Implementation MyClass

@ Synthesize Name, Vorname;

@ End

, possiamo scrive: Wenn Sie gehen zu unserer Klasse verwenden, MyClass , dh wenn istanziaremo ein Objekt vom Typ MyClass , können wir schreiben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Jede andere Klasse, als AppDelegate
/ / In der Datei. H
# Import <UIKit/UIKit.h>
# Import "MyClass.h"

@ Klasse TestViewController;

NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * Fenster;
* TestViewController viewController;

MyClass * MyClass;
}

/ / In der Datei. M
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome);

Oder, was äquivalent:

1
2
3
/ / Immer in der Datei. M
@ "Undolog" ] ; [SetNome MyClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]);

So weit so gut. Allerdings könnte es Irreführung der Gleichwertigkeit der "variabli" interne (ivar) als Immobilien. Um den Unterschied zu verstehen, noch einmal vorschlagen, das gleiche wie der Verzicht, diese Zeit der @synthesize . . Nun, deshalb sollten wir mit uns zu tun, um die Methoden zu schreiben getter und setter . Zur weiteren betonen die Unterschiede, die internen Variablen rinominerò Einfügen einen Unterstrich vor dem Namen. Aber wir sehen den Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Import <Foundation/Foundation.h>

NSObject { @ Interface MyClass: NSObject {
_nome; NSString * _Name;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) name; / / get
NSString * ) cognome; // get - ( NSString *) name; / / get

void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / set
void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / set

@ End

. Im Gegensatz zum vorherigen Beispiel die Zeiger auf die internen Variablen (incapsultate) geworden _nome und _cognome . . @property è scomparso, in quanto non serve più. Darüber hinaus gibt es vier Verfahren, die unseren Definitionen repräsentieren get und set . @property ist verschwunden, als nicht mehr benötigt.
Wir sehen die Umsetzung Datei MyClass.m :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Import "MyClass.h"

@ Implementation MyClass

/ / Holen Sie sich einen "Namen"
NSString * ) nome { - ( NSString *) name {
_Name Rückkehr;
}
/ / Um "name" Set
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_Name = StringaIngresso;
}

/ / Für "Nachname" Get
NSString * ) cognome { - ( NSString *) name {
_cognome zurückkehren;
}
/ / Auf "Nachname" Set
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Eine Klasse kann genau so geschrieben wie der vorherige, also verwendet werden:

1
2
3
4
5
6
7
8
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome);

/ / Oder, was äquivalent:

@ "Undolog" ] ; [SetNome MyClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]);

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Auf der Ebene der pädagogischen Vernachlässigung @synthesize zwang uns zu schreiben "ihre eigenen" Methoden get und set , Hervorhebung - auch mit dem Zusatz dell'underscore - die Unterschiede zwischen dem Namen der Eigenschaft und ihre internen Ivar _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. Auf funktionaler Ebene der persönliche Einsatz der Methoden get und set ermöglicht Echtzeit-Steuerung der Daten vor ihrer Einstellung (oder vor seiner Lesung) und dann eine echte Kapselung, um die interne Variable zu schützen.
Zum Beispiel, wäre es möglich, um den Durchgang von leeren Zeichenketten dem Eigentum zu verhindern nome :

1
2
3
4
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name";
_Name = StringaIngresso;
}

Weitere Variante

Wenn Sie die internen Variablen mit einem Unterstrich vor (wer rpoviene Adobe ActionScript könnte auch verwendet werden) nutzen wollen ist nicht notwendig, die Verwendung der Richtlinie aufzugeben @synthesize . Xcode macht es möglich, "verschmelzen" die oben genannten Methoden:

1
2
_nome; @ Name = _Name synthetisieren;
_cognome; @ Name = _cognome synthetisieren;

. Dabei haben wir intern verwenden könnten Zeiger _nome ", resümierte" - nach außen - als eine Eigenschaft nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . Auch wenn die Verwendung von @synthesize produziert automatische Generierung Methoden (Nachrichten) von getter und setter , ist auch wahr, dass sie das tut nur wenn er sie findet, wenn Sie so wollen, um "implementieren" eine Methode für Ihre getter und / oder setter können dies tun, auch wenn Sie die Richtlinie verwendet @synthesize .

Speicherzuordnungen

In den obigen Beispielen habe ich einige wichtige Details für eine reale Umsetzung verzichtet. Zunächst einmal habe ich keine Methode gezeigt init() , nützlich für die Initialisierung des Objektes und Standardwerte. Außerdem ist es nicht die Zugabe von ein Verfahren dealloc() :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/ / File MyClass.m
# Import "MyClass.h"

@ Implementation MyClass

id ) init { - (Id) init {
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _Name @ = "Name der Voreinstellung";
"Cognome preimpostato" ; _cognome @ = "Name der Voreinstellung";
}
Selbst zurückkehren;
}

void ) dealloc { - (Void) {dealloc
; [_Name Release];
; [_cognome Release];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) name {
_Name Rückkehr;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name";
_Name = StringaIngresso;
}

NSString * ) cognome { - ( NSString *) name {
_cognome zurückkehren;
}
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

, etc… In Zukunft werden wir dann sehen, die Details zu den Eigenschaften readonly , retain , etc ... :)

Mehr ...

Browser oder mobilen Browser?

Unsere Website wird nicht mehr nur aus Computer-Terminals angezeigt. Mit der Verbreitung von mobilen, dank Apple iPhone, Zugriff auf die Website oder ein Blog wird zunehmend von einer Vielzahl von mobilen Geräten durchgeführt. Werden Sie Web Developer so viele Notwendigkeit, der Lage sein, abzufangen und zu identifizieren, die verschiedenen "Agenten", also das Mittel, mit denen ein Benutzer betrachten (Browsing) ist auf unseren Seiten.

Mehr ...

Anpassen eines Formular grafisch

Ich wurde gefragt, wie man eine grafische Form, darunter ein Suchfeld, wie die auf diesem Blog anpassen. Die verwendete Technik, oder besser, die ich benutze, ist es offensichtlich gültig für jede Art von Modul zu bilden. Was sich ändert, ist nur die Komplexität der Arbeit zu tun, abhängig von der Komplexität des Formulars selbst werden.

Mehr ...

WordPress: sehen Sie die neuesten Themen in bbPress

Wir haben gesehen , wie die integrierten Kernel WordPress bbPress , zum Beispiel, um eine Funktion zu nutzen oder teilen Sie Ihre WordPress-Theme. Jetzt werden wir sehen die contraio, nämlich, wie die Informationen in der bbPress Forum-Startseite von WordPress anzuzeigen. Dazu gibt es einige Plugins (einige Arbeits-und andere nicht). Hier werden wir sehen, wie wir schreiben eine - wirklich - einfache Funktion, die für den Fall, verbessert und kann in allen Fällen perfektioniert werden.

Mehr ...

Apple iPhone: Erstellen Sie eine benutzerdefinierte Schaltfläche mit Umschaltfunktion

non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! Die Staaten UIControlStateSelected oder UIControlStateHighlighted funktionieren nicht, wenn ein UIButton im Modus eingestellt ist UIButtonTypeCustom ! Oder besser gesagt, funktionieren nicht (weil für andere Arten von Button vorbehalten), zum Beispiel um eine Schaltfläche mit zwei Zuständen zu erstellen: Toggle-Note. Wenn wir zwei Bilder (stato1.png und stato2.png) für unsere Button erstellt haben, können wir wie folgt vorgehen:

1
2
3
/ / Die Header-Datei, dass wir eine globale Variable für usaremo erstellen
/ / Um die Überprüfung war
BOOL toggleFlag;

Nun erstellen wir unseren Button:

1
2
3
4
5
6
7
8
9
/ / Wir schaffen einen Knopf, und wir stellen Sie es zunächst in den Zustand "stato1.png"
/ / Edit initWithFrame: (CGRect) {} 100,100,50,50 mit der Position und
/ / Größe des Bildes hat
; toggleFlag = YES;
[ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : ( CGRect ) { 100 , 100 , 50 , 50 } ] ; UIButton ToggleButton * = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: (CGRect) {100, 100, 50, 50}];
@ "" forState : UIControlStateNormal ] ; [ToggleButton setTitle: @ "" forState: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton SetBackgroundImage: [UIImage imageNamed: @ "stato1.png"] forState: UIControlStateNormal];
self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [ToggleButton AddTarget: Selbst Aktion: @ selector (onToggle :) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

Wenn Sie auf den Button wird eine Nachricht zu hinterlassen verwaltet werden onToggle :

1
2
3
4
5
6
7
void ) onToggle : ( id ) sender { - (Void) onToggle: (id) sender {
/ / Hole Zeiger auf UIButton
( UIButton * ) sender; UIButton ButtonClicked * = (UIButton *) sender;
/ / Ausführen der Toogle
toggleFlag = toggleFlag!;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked SetBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png" @ "stato2.png"] forState:? UIControlStateNormal];
}

Mehr ...

Sehr kurze Auszug: Streaming-MP3-Dateien auf Apple iPhone

Eine Alternative wirklich einfach zu führen ein Bach eine mp3-Datei auf dem Apple iPhone können sein:

Mehr ...


Stop SOPA