Artikel Tagged 'Objective-C'


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 zu:

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 verwendet werden, und zwar:

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 zu:

@ "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, 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 eines Verfahrens 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 ...

Sehr kurze Auszug: Apple iPhone-Dateisystem

Sowohl die Mac OS X, dass das iPhone OS, kann man einfach und direkt Zugriff auf das Verzeichnis - ganz wichtig - das System, das sind:

1
2
3
NSHomeDirectory Gibt den Pfad zum aktuellen Benutzer-Verzeichnis.
Gibt den Pfad zu einem gegebenen Benutzer-Verzeichnis NSHomeDirectoryForUser.
NSTemporaryDirectory Gibt den Pfad des temporären Verzeichnisses für den aktuellen Benutzer.

Mehr ...

Objective-C: NSLog () der C-Struktur

o CGPoint , ad esempio. Die Syntax NSLog(@"%@", ... ); funktioniert und wird verwendet, um Informationen über Objekte zu erhalten, aber nicht auf C-Datentypen wie struct arbeiten CGRect oder CGPoint , zum Beispiel. o NSStringFromCGPoint : Um die Vorteile zu nehmen NSLog(@"%@", ... ); auch C-Stil-Strukturen können wir auf Umwandlung Funktionen wie Lean NSStringFromCGRect() oder NSStringFromCGPoint :

1
2
3
4
5
CGRect ) { 10 , 20 , 30 , 40 } ; CGRect mioRect = (CGRect) {10, 20, 30, 40};
CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64};
/ /
"Info rettangolo: %@" , NSStringFromCGRect ( mioRect ) ) ; NSLog (@ "Info Rechteck:% @", NSStringFromCGRect (mioRect));
"Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "Info Point:% @", NSStringFromCGPoint (mioPoint));

Insbesondere ist es möglich, die Verfahren entsprechende kleine nützliche Makros wie zu verfeinern:

1
# Definieren NSLogRect (rect) NSLog (@ "% s (% 0.0f,% 0.0f)% 0.0fx% 0.0f", # rect, rect.origin.x, rect.origin.y, rect.size.width , rect.size.height)

Oder:

1
2
3
4
# Definieren NSLogCGPoint (Punkt) NSLog (@ "% s (% 0.0f,% 0.0f)" # point.x Punkt, Point.y)

CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64};
; NSLogCGPoint (mioPoint);

Das wird als Ausgabe zu geben:

1
32 , 64 ) mioPoint: (32, 64)

Mehr ...

XCode Objective-C: nützliche Tastenkombinationen

XCode ist eine sehr leistungsfähige Entwicklungsumgebung und behält einige Überraschungen. Es ermöglicht eine ähnliche Funktion wie der "Schnipsel" des berühmten Editor TextMate . In der Praxis ist es möglich, Code-Blöcke mit dem ESC + eine Kombination von einem oder mehreren Sequenzen von Zeichen einzufügen. e otterrete: Zum Beispiel, wenn Sie einen Block einfügen if versuchen Sie ESC+if und Sie erhalten:

Immagine 3

. Wie in der Abbildung gezeigt, wird ein Menü (das gleiche Auto-Vervollständigung), wo Sie zwischen einem einfachen Block können wählen, if oder if/else . Mit einem Klick auf "Senden" erhalten Sie:

Immagine 4

Hier sind zwei Links für die vollständige Liste der Tastaturkürzel:

Mehr ...

Sehr kurze Schnipsel: iPhone, Zufallszahlen

Wenn Sie generieren müssen Zufallszahlen in einer Anwendung müssen beiseite Apple iPhone Objective-C, weil es nicht vorschlagen, jede Klasse um. Die Lösung wird vorgeschlagen, dass die C: rand(), srand(), random(), srandom() e arc4random() .

Mehr ...

iPhone: Erstellen Sie einen Weg, um auf Ereignisse, die Klasse zu überqueren reagieren

Normalerweise wird ein Ereignis, das nichts anderes als eine Nachricht festgelegt ist (gesetzt und umgesetzt) ​​in der gleichen Klasse oder Rahmen, die Funktion oder Prozedur "Anrufer" ist. o in un UIViewController . Wenn wir zum Beispiel eine Schaltfläche hinzufügen UIButton via Code (programmatisch), können wir unsere Klasse in einem zu finden UIView oder einem UIViewController . In beiden Fällen ist die Aufgabenverteilung und die Initialisierung der Taste wird durch die Einstellung des befolgt werden target , die eine Nachricht erhalten soll, wenn es "Klick" auf die Schaltfläche ein:

1
2
3
4
5
6
7
8
9
[ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton Taste * = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Press me" forState : UIControlStateNormal ] ; [Button setTitle: @ "Drück mich" forState: UIControlStateNormal];
/ / Entscheiden Sie, wer die Nachricht erhalten UIControlEventTouchUpInside
self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget Button: Selbst Aktion: @ selector (OnButtonClicked) forControlEvents: UIControlEventTouchUpInside];
/ / ...
void ) onButtonClicked { - (Void) {OnButtonClicked
/ / ...
}

Zeile 5 der oben angezeigten Code entscheidet, wer (Subjekt) und was (Verfahren) "Anruf", wenn unsere Taste gedrückt wird. Im obigen Beispiel ist bekannt, dass die Druckeinstellung für die Nachricht an das Verfahren gesendet wird dargestellt onButtonClick umgesetzt unten, und dann einen Teil der gleichen Kontext (oder Klasse). potremmo inviare il nostro messaggio ad un qualsiasi altro oggetto, posto quindi al difuori del contesto in uso. Die erste Überlegung ist offensichtlich, dass wir tun können, ist dann, dass durch Veränderung der Parameter self und action können wir unsere Botschaft an jedes andere Objekt zu senden, dann auch außerhalb des Kontextes, in Gebrauch. : Hier ein Beispiel: Eine Klasse UIApplicationDelegate eine UIViewController :

1
2
3
4
5
/ /
/ / MyAppDelegate.m
/ /
SplashScreenController alloc ] ; splashScreenController = [SplashScreenController alloc];
splashScreenController.view ] ; [Window addSubview: splashScreenController.view];

associata al UIViewController stesso: Die SplashScreenController macht eine Methode, mit der Sie die Animation erlaubt UIView mit verbundenen UIViewController gleiche:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/ /
/ / SplashScreenController.m
/ /
void ) animateBackgroundDown { - (Void) {animateBackgroundDown
nil context : nil ] ; [UIView beginAnimations: nil context: nil];
0.75 ] ; [UIView setAnimationDuration: 0,75];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
self ] ; [UIView setAnimationDelegate: self];
@selector ( onAnimationFinished ) ] ; [UIView setAnimationDidStopSelector: @ selector (onAnimationFinished)];
CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480};
; [UIView commitAnimations];
}
/ / ...
void ) onAnimationFinished { - (Void) {onAnimationFinished
"Animazione terminata" ) ; NSLog (@ "Animation beendet");
}

. Der obige Code zeigt eine Methode innerhalb der Klasse definiert SplashScreenController Typ UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . Es tut nichts, aber animieren die UIView animieren ihn hin, und wenn die Animation abgeschlossen ist, rufen Sie (senden eine Nachricht an sich selbst - und damit self ) onAnimationFinished unten definiert, ist ein Teil der Klasse immer SplashScreenController . , non saremo informati della fine dell'animazione: Daraus folgt, dass in unserem myAppDelegate , wenn wir die Methode aufrufen animateBackgroundDown , werden wir nicht von dem Ende der Animation zu informieren:

1
2
3
4
/ /
/ / MyAppDelegate.m
/ /
; [SplashScreenController animateBackgroundDown];

Was wir wollen, stattdessen ist es, eine neue Version erstellen animateBackgroundDown als ihm zu sagen, wo um die Nachricht zu Ende Animation senden und welche Methode zu nennen. In der Praxis wollen wir sicherstellen, können Sie in unserer Klasse schreiben myAppDelegate :

1
2
3
4
5
6
7
8
/ /
/ / MyAppDelegate.m
/ /
self selector : @selector ( onAnimationFinished ) ] ; [SplashScreenController animateBackgroundDown: self selector: @ selector (onAnimationFinished)];
/ / ...
void ) onAnimationFinished { - (Void) {onAnimationFinished
"Animazione terminata" ) ; NSLog (@ "Animation beendet");
}

, bensì in myAppDelegate . Dieses Mal das Verfahren onAnimationFinished nicht im UIViewController , aber in myAppDelegate . nel modo seguente: Dazu ändern Sie einfach die Methode animateBackgroundDown in UIViewController wie folgt:

1
2
3
4
5
6
7
8
9
10
11
12
/ /
/ / SplashScreenController.m
/ /
void ) animateBackgroundDown : ( id ) target selector : ( SEL ) selector { - (Void) animateBackgroundDown: (id) Zielauswahlvorrichtung: (SEL) {Selektor
nil context : nil ] ; [UIView beginAnimations: nil context: nil];
0.75 ] ; [UIView setAnimationDuration: 0,75];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
target ] ; [UIView setAnimationDelegate: target];
selector ] ; [UIView setAnimationDidStopSelector: Selektor];
CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480};
; [UIView commitAnimations];
}

). Jetzt haben wir eine Methode, die den "Kontext" (akzeptiert target ) und die Methode aufgerufen werden ( selector ). a qualsiasi altro “oggetto” / classe in grado di riceverlo. Nun, wenn die Animation beendet, erscheint die Meldung AnimationDidStop geht an myAppDelegate andere "Objekt" / Klasse, die sie empfangen können.

Mehr ...

Objective-C: eine Alternative zur Verwendung CGRectMake

CGRectMake() ist eine Funktion (eigentlich ein Inline # define) verwendet eine Menge vor allem, wenn Objekte durch Code oder grafische Benutzeroberfläche erstellt werden. o UIImageView . CGRectMake() restituisce una struct (struttura di tipo) CGRect : Seine Verwendung ist daher oft die Initialisierung von Komponenten verbunden UIKit , sondern auch auf einfache UIView oder UIImageView . CGRectMake() gibt ein struct (Struktur-Typ) CGRect :

1
2
3
4
5
struct {CGRect
CGPoint Ursprungs;
CGSize Größe;
};
typedef struct CGRect CGRect;

: Welche wiederum von zwei unterschiedlichen Struktur zusammengesetzt CGPoint und CGSize :

1
2
3
4
5
6
7
8
9
10
11
12
13
struct {CGPoint
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;

/ * Größen. * /

struct {CGSize
CGFloat Breite;
CGFloat Höhe;
};
typedef struct CGSize CGSize;

. Das, die ihrerseits wieder, enthalten Typen CGFloat , oder Arten float . Wenn wir analysieren den Code von CGRectMake () sind:

1
2
3
4
5
6
7
8
CG_INLINE CGRect
CGRectMake (CGFloat x, y CGFloat, CGFloat Breite, Höhe CGFloat)
{
CGRect rect;
y; rect.origin.x = x; rect.origin.y = y;
height; rect.size.width = Breite; rect.size.height = height;
zurück rect;
}

Es folgt daher, dass dieser Teil des Codes:

1
2
3
4
[ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect];
12 , 409 , 100 , 40 ) ; gbutton.frame = CGRectMake (12, 409, 100, 40);
@ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Presse" forState: UIControlStateNormal];
gbutton ] ; [MainWindow addSubview: gbutton];

Es könnte zu Recht geschrieben werden als:

1
2
3
4
[ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect];
CGRect ) { 12 , 409 , 100 , 40 } ; gbutton.frame = (CGRect) {12, 409, 100, 40};
@ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Presse" forState: UIControlStateNormal];
gbutton ] ; [MainWindow addSubview: gbutton];

Nur um die Dinge zu beschleunigen "der Code ausgeführt wird ... :)

Mehr ...

Xcode Verknüpfung

Xcode ist eine wirklich gute Entwicklungsumgebung, schön und voller Details, die effizienten Code schreiben und angenehmer machen. Unter ihnen ist sicherlich die Bequemlichkeit der automatischen Vervollständigung bei der Eingabe, insbesondere beim Schreiben von Anwendungen für Apple iPhone, wo die Rahmenbedingungen sind vielfältig und erinnern Syntax und Nomenklatur führt zur Zeit ein paar.

Mehr ...

iPhone: eine Klasse erweitern UIView

creato. Ich will zeigen, wie es möglich ist, in eine einfache und schnelle, eine Klasse zu erweitern UIView in einer Weise, die zu einer neuen Initialisierung Verfahren weiter mit dem Objekt-Code anpassen reagiert UIView erstellt. Wie einige von Ihnen wahrscheinlich wissen, ist Objective-C nicht unterstützen einen einzigen Hersteller, wie in anderen objektorientierten Sprachen (wie z. B. Adobe ActionScript oder PHP5). E 'kann in der Tat, erstellen Sie eine Instanz einer Klasse manuell aufrufen verschiedener Hersteller (praktisch unendlich). . Normalerweise sind wir es gewohnt, Objekte zu erstellen UIView mit dem klassischen initWithFrame . Nehmen wir an, wir aber um eine neue Klasse von visuellen Objekten erstellen, ausgehend von einem wollen UIView , mit einigen Zusätzlich wird ein solches Etikett integriert. . Im Grunde, was wir wollen, ist, dass unser Objekt instanziieren es schafft, sowie die UIView , ein Objekt vom Typ UILabel . Zum Beispiel könnten wir wollen bis zum Ende zu erhalten:

1
[ [ ViewLabel alloc ] initWithLabelDefine : CGRectMake ( 0 , 0 , 320 , 80 ) label : @ "Ciao" ] ; ViewLabel * VL = [[ViewLabel alloc] initWithLabelDefine: CGRectMake (0, 0, 320, 80) label: @ "Hallo"];

: Dazu erstellen Sie einfach eine neue Klasse des Typs UIView und Call ViewLabel :

1
2
3
4
5
6
7
8
9
10
11
12
13
/ /
/ / ViewLabel.h
/ /

# Import <UIKit/UIKit.h>

UIView { @ Interface ViewLabel: UIView {
UILabel * internalLabel;
}

id ) initWithLabelDefine : ( CGRect ) frame label : ( NSString * ) labelDefine; - (Id) initWithLabelDefine: (CGRect) Bildbezeichnung: ( NSString *) labelDefine;

@ End
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
36
37
38
39
40
41
42
43
44
/ /
/ / ViewLabel.m
/ /

# Import "ViewLabel.h"

@ Implementation ViewLabel

id ) initWithFrame : ( CGRect ) frame { - (Id) initWithFrame: (CGRect) frame {

self = [ super initWithFrame : frame ] ) { if (self = [super initWithFrame: frame]) {
/ / Initialisierung Code
}
Selbst zurückkehren;
}

/ /
/ / Unsere neue Initialisierung
/ /
id ) initWithLabelDefine : ( CGRect ) frame label : ( NSString * ) labelDefine { - (Id) initWithLabelDefine: (CGRect) Bildbezeichnung: ( NSString *) {labelDefine

self = [ super initWithFrame : frame ] ) { if (self = [super initWithFrame: frame]) {
/ / Hier können Sie entscheiden, wie sie sich verhalten, ich für
/ / Ich habe das gleiche Gestell Sicherheit in der Vergangenheit
/ / Input, aber ich setzen Sie den x-und y-
; frame.origin.x = 0;
; frame.origin.y = 0;
UILabel alloc ] initWithFrame : frame ] ; internalLabel = [[UILabel alloc] initWithFrame: frame];
internalLabel.text = labelDefine;
internalLabel ] ; [Self addSubview: internalLabel];
; [InternalLabel release];
}
Selbst zurückkehren;
}

void ) drawRect : ( CGRect ) rect { - (Void) drawRect: (CGRect) rect {
/ / Zeichnen-Code
}

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

@ End

Zum Zeitpunkt der Erstellung unserer neuen Klasse, könnten wir verwenden:

1
[ [ ViewLabel alloc ] initWithLabelDefine : CGRectMake ( 0 , 0 , 320 , 80 ) label : @ "Ciao" ] ; ViewLabel * VL = [[ViewLabel alloc] initWithLabelDefine: CGRectMake (0, 0, 320, 80) label: @ "Hallo"];

Mehr ...

iPhone SecondApp: Guess the Zahl - Teil 2

Wie bereits erwähnt FirstApp iPhone: Guess the Zahl - Teil 1 sehen wir, wie Sie eine Anwendung für das Apple iPhone ohne Interface Builder zu machen! In der Tat werden wir beseitigen physischen Dateien von Interface Builder Wizard erstellt Xcode. Am Ende von diesem Post, dann haben wir eine Anwendung in jeder Hinsicht identisch, die denen im ersten Teil gebaut, mit dem Unterschied, dass wir alle unsere visuelle Komponenten, einschließlich der im Hauptfenster für vollständige Code zu erreichen.

Die Anwendung bereits gemacht, wenn Sie gerade herunterladen möchten, finden Sie auf meiner Google-Code-Repository:

Ich möchte darauf hinweisen, das sofort als ZIP dieses Beispiels wiegt weniger als das letzte Mal! :)

Wir schaffen das Projekt

Wir beginnen mit der Erstellung unseres Projektes SecondApp (um es von FirstApp unterscheiden), obwohl diese Zeitfenster-basierte Applikation Bitte wählen Sie:

newproject

Nun wollen wir löschen alles, was mit Interface Builder. : eliminatelo anche dal file system, quindi selezionate Also Move to Trash . Beseitigen Sie die Datei MainWindow.xib , sich im Ordner Resources , entfernen Sie sie aus dem Dateisystem auch, und wählen Sie dann auch den Papierkorb verschieben. nella casella Main nib file base name : Wählen Sie dann die Datei SecondoApp-info.plist und löschen Sie den Verweis auf die MainWindow nib-Datei in der Main-box basierte Name:

deleteib

An dieser Stelle haben wir nicht mehr alle Fenster, zumindest über Interface Builder. , e modifichiamo la funzione main() in questo modo: Also öffnen wir die Datei main.m , in gelegen Other Sources , und ändern Sie die Funktion main() etwa so:

1
2
3
4
5
6
7
8
9
10
11
int argc, char * argv [ ] ) { int main (int argc, char * argv []) {

pool = [ [ NSAutoreleasePool alloc ] init ] ; NSAutoreleasePool Pool * = [[ NSAutoreleasePool alloc] init];

/ / Durch das Entfernen der Datei. XIB wir verloren Tracking
/ / Die App Delegierter und dann weiterzugeben, um "Hand"
UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int retVal = UIApplicationMain (argc, argv, nil, @ "SecondAppAppDelegate");

; [Pool release];
zurück retVal;
}

Öffnen Sie SecondAppAppDelegate.me dann schaffen wir das Hauptfenster über den Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ) applicationDidFinishLaunching : ( UIApplication * ) application { - (Void) applicationDidFinishLaunching: (UIApplication *) Anwendung {

/ / Holen Sie sich die Bildschirmgröße (320, 480)
UIScreen mainScreen ] applicationFrame ] ; CGRect windowRect = [[UIScreen mainScreen] applicationFrame];
/ / Erzeugt ein Fenster - so wie wir Bye Bye zu Interface Builder tat
[ [ UIWindow alloc ] initWithFrame : windowRect ] ; UIWindow MainWindow * = [[UIWindow alloc] initWithFrame: windowRect];
/ / Stellen Sie den Hintergrund des Fensters, um gelbe, zu differenzieren
/ / Die ältere Anmeldung FirstApp
[ UIColor yellowColor ] ] ; [MainWindow setBackgroundColor: [UIColor yellowColor]];

mainWindow ] ; [Self setWindow: MainWindow];
; [Window makeKeyAndVisible];

; [MainWindow release];
}

Sie können bereits testen Sie die Anwendung, wenn ein Fenster erscheint gelb Sie haben alles richtig gemacht!

, necessario solo se si usa Interface Builder. In der Datei SecondAppAppDelegate.h können wir beseitigen IBOutlet , nur benötigt, wenn Sie Interface Builder verwenden. Auch hier hinzufügen, dass unsere globale Variablen, das letzte Mal, dass wir in der Steuerung eingegeben hatte. Dann ändern Sie die Datei SecondAppAppDelegate.h :

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

NSObject <UIApplicationDelegate> { @ Interface SecondAppAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * Fenster;

UITextField * Zahl;
UIButton *-Taste;
int numeroACaso;
}

nonatomic, retain ) UIWindow * window; @ Property (atomare, behalten) UIWindow * Fenster;

void ) controllaNumero; - (Void) getNumber;

@ End

, in quanto non stiamo usando Interface Builder. Auch in diesem Fall haben wir die Definition der Methode vorbereitet controllaNumero , wie beim letzten Mal, aber wir haben den Hinweis beseitigt IBAction , da wir nicht mit Interface Builder.

Wir bilden die Schnittstelle Code

Es ist Zeit, um Code mit allen Komponenten unserer Schnittstelle zu schaffen. ed inseriamo il seguente codice: Wir kehren in der Datei SecondAppAppDelegate.m , posizioniamoci vor [mainWindow release] und setzen Sie den folgenden Code ein:

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
/ / Erstellen Sie auf die Titelleiste
[ [ UINavigationBar alloc ] initWithFrame : CGRectMake ( 0.0 , 0.0 , 320.0 , 44.0 ) ] ; UINavigationBar myNavigationBar * = [[UINavigationBar alloc] initWithFrame: CGRectMake (0,0, 0,0, 320,0, 44,0)];
myNavigationBar.barStyle = UIBarStyleDefault;
[ [ UINavigationItem alloc ] initWithTitle : @ "Indovina un numero" ] ; UINavigationItem navigationItem * = [[UINavigationItem alloc] initWithTitle: @ "Rate mal eine Zahl"];
navigationItem animated : NO ] ; [MyNavigationBar pushNavigationItem: navigationItem animiert: NO];
myNavigationBar ] ; [Window addSubview: myNavigationBar];

/ / Erstellen Sie das Etikett
[ [ UILabel alloc ] initWithFrame : CGRectMake ( 10 , 50 , 300 , 80 ) ] ; UILabel myLabel * = [[UILabel alloc] initWithFrame: CGRectMake (10, 50, 300, 80)];
UIColor clearColor ] ; myLabel.backgroundColor = [UIColor clearColor];
; myLabel.numberOfLines = 2;
"iPhone ha pensato un numero da 1 a 10, prova ad indovinarlo?" ; myLabel.text = @ "Das iPhone hat eine Zahl von 1 bis 10 ausgebildet, versuchen zu erraten?"
myLabel ] ; [Window addSubview: myLabel];

/ / Erstellen der Texteingabe
UITextField alloc ] initWithFrame : CGRectMake ( 10 , 120 , 300 , 30 ) ] ; Zahl = [[UITextField alloc] initWithFrame: CGRectMake (10, 120, 300, 30)];
numero.borderStyle = UITextBorderStyleRoundedRect;
numero.textAlignment = UITextAlignmentCenter;
numero.keyboardType = UIKeyboardTypeNumberPad;
"Inserisci il numero" ; numero.placeholder = @ "Nummer eingeben";
numero ] ; [Window addSubview: Anzahl];

/ / Erstellen der Taste
UIButton buttonWithType : UIButtonTypeRoundedRect ] ; Taste = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Premi qui" forState : UIControlStateNormal ] ; [Button setTitle: @ "Hier klicken" forState: UIControlStateNormal];
self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget Button: Selbst Aktion: @ selector (getNumber) forControlEvents: UIControlEventTouchUpInside];
bottone ] ; [Window addSubview: Taste];

; [MyLabel release];
; [NavigationItem release];
; [MyNavigationBar release];

della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Da das ' applicationDidFinishLaunching entspricht viewDidLoad wie beim letzten Mal, direkt nach dem [mainWindow release]; Einsatz:

1
+ arc4random ( ) % 10 ; numeroACaso = 1 + arc4random ()% 10;

Jetzt können wir tun, ist die Methode umzusetzen controllaNumero , die gleich wird (abgesehen von dem Prototyp) zum letzten Mal benutzt ein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void ) controllaNumero { - (Void) {getNumber
"Premuto bottone di controlla numero" ) ; NSLog (@ "gedrückten Taste Steuerung Zahl");
[ numero.text integerValue ] ; numeroInserito int = [numero.text integerWert];
message; NSString * message;
"Il numero inserito è %d" , numeroInserito ) ; NSLog (@ "Die eingegebene Zahl ist% d", numeroInserito);
numeroInserito <numeroACaso ) { wenn (numeroInserito <numeroACaso) {
"Troppo basso..." ; message = @ "zu niedrig ...";
( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) {
"Troppo alto..." ; @ message = "Too high ...";
( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) {
"Bravo hai indovinato" ; @ message = "Bravo Sie haben es erraten";
+ arc4random ( ) % 10 ; numeroACaso = 1 + arc4random ()% 10;
"Numero pensato %d" , numeroACaso ) ; NSLog (@ "% d dachte:" numeroACaso);
}
[ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc]
"Responso" initWithTitle: @ "Response"
Nachricht: Nachrichten
Delegierter: nil
"OK" cancelButtonTitle: @ "OK"
] ; otherButtonTitles: nil];
; [AlertMessaggio Show];
; [AlertMessaggio release];
"" ; numero.text @ = "";
}

Wir sind fertig!

Schlussfolgerungen und Überlegungen

, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Dieses Beispiel macht nicht den direkten Einsatz eines UIView oder UIViewController , weil ich es so einfach und einheitlich wie möglich verlassen wollten und auch, um zu zeigen, dass die Elemente nicht immer notwendig sind. Allerdings kann das Einfügen von Objekten direkt im Fenster haben einen Sinn in diesem Beispiel und andere sporadische Kontexten. portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro. Die Verwendung von UIView und UIViewController noch Vorteile bringen in vielen anderen Fällen, undbei einige sind fast unverzichtbar, wie wir in Zukunft sehen werden.

Mehr ...



Stoppen Sie SOPA