Kategorie 'Mobile'
Apple iPhone und iPod wurden verwendet, um ein einzelnes Bild-Datei zu verwalten, um die Anwendung, die Datei zu laden Default.png . Apple iPad, erfordert jedoch die verschiedenen Management-Orientierung der Verwendung mehrerer Bilddateien, um sicher zu sein sehen Sie die Splash-Screen richtig auf die Ausrichtung des Geräts an. Beim Start der Anwendung, wie es der Fall für das iPhone, ist es nicht möglich, den Code für "Wunder", wie das Gerät orientierte eingreifen. Glücklicherweise war es in das automatische Laden von speziellen Dateien je nach Ausrichtung eingeführt:

Die Dateien werden unterstützt, zusätzlich zu den klassischen Default.png empfehlen nicht zu verwenden, weil es skaliert und nach Anleitung verformt, sind:
- Default-Portrait.png
- Default-PortraitUpsideDown.png
- Default-Landscape.png
- Default-LandscapeLeft.png
- Default-LandscapeRight.png
e LandscapeRight possono essere utilizzate per determinare orietamento e verso di quest'ultimo. Versionen PortraitUpsideDown , LandscapeLeft und LandscapeRight können verwendet werden, um orietamento und in Richtung des letzteren zu bestimmen.
Anwendung zu starten, dann, wie von Apple empfohlen, ist es gut "Redesign" - wo nötig - unsere Ansichten Handeln in application:didFinishLaunchingWithOptions .
Fortsetzung ...
In den meisten Fällen, oder weil wir es gewohnt, oder weil wir haben in Tutorien gesehen und in einigen Texten, verwenden wir die setAnimationDidStopSelector auf diese Weise:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| nil context : NULL ] ; [UIView beginAnimations: nil context: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1,5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; self ] ; [UIView setAnimationDelegate: self]; @selector ( removeView ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeView)];
; myView.alpha = 0;
; [UIView commitAnimations];
/ /
void ) removeView { - (Void) {removeView ; [MyView removeFromSuperview]; } |
come delegato e tramite la setAnimationDidStopSelector gli invia un messaggio removeView quando l'animazione è terminata. In den obigen Code die setAnimationDelegate Satz self als Delegierter und durch setAnimationDidStopSelector sendet eine Nachricht removeView , wenn die Animation beendet ist. Der Code selbst ist richtig, aber nutzt eine Nachricht Definition ( removeView ), die weggelassen werden könnte. Nun, hier ist der gleiche Code, mit dem gleichen Effekt, ohne die Nachricht removeView :
1 2 3 4 5 6 7 8 9
| nil context : NULL ] ; [UIView beginAnimations: nil context: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1,5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; myView ] ; [UIView setAnimationDelegate: myView]; @selector ( removeFromSuperview ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeFromSuperview)];
; myView.alpha = 0;
; [UIView commitAnimations]; |
! Das Interessante an diesem Ansatz ist, dass myView könnte eine Unterklasse von werden UIView ! Es kann daher eine benutzerdefinierte Klasse mit eigenen Nachrichten und, wie gesagt, leicht aufrufbar sein setAnimationDidStopSelector . Darüber hinaus die setAnimationDidStopSelector einverstanden Selektoren mit den Parametern:
1 2 3 4 5 6 7 8 9
| nil context : NULL ] ; [UIView beginAnimations: nil context: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1,5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; myView ] ; [UIView setAnimationDelegate: myView]; @selector ( myMessage : param1 : ) ] ; [UIView setAnimationDidStopSelector: @ selector (myMessage: param1:)];
; myView.alpha = 0;
; [UIView commitAnimations]; |
Dieses Beispiel auf alle Fälle hier, wo wir ein Delegierter erweitert werden kann, ist Atro nicht einen Zeiger auf eine Instanz eines Objekts.
Fortsetzung ...
Nach der Erläuterung , wie wir unsere Saiten in Xcode zu finden , ist es einfach, jetzt, wie zu sehen - durch die Anwendung der gleichen Technik - zu lokalisieren und Betrachtung von Bildern / interfaces mit Interface Builder erstellt.
Suchen Sie Graphik-Ressourcen
Der Prozess, wie erwähnt, ist die gleiche, wenn wir ein Bild bereits in unsere Ressourcen enthalten sind, oder sie setzen einen neuen ein, und wir wollen "locate" - das heißt, auf zwei oder mehr Bilder auf Basis der unterstützten Sprachen zu verwalten - klicken Sie einfach auf den Button Bild rechts ( Adium.png in diesem Beispiel), und wählen Sie Get Info:

Make File Localizable wir in der unteren linken Seite klicken.

Wir klicken Sie auf Hinzufügen und fügen Localization Italian :

Um zu erhalten:

esattamente come accadeva con il testo: Unser Bild bewegt wird (physisch, eines der seltenen Male, wenn das passiert nell'alberatura Xcode auf dem Dateisystem wird reflektiert) unter virtuellen Ordnern English.lproj und Italian.lproj genau wie mit dem Text passiert:

contiene una stessa versione dell'immagine. An dieser Stelle jeden der Ordner English.lproj und Italian.lproj enthält die gleiche Version des Bildes. Standardmäßig - - die englische Version Dieses Bild ist in Interface Builder, wo wir sehen, manipuliert.
An diesem Punkt einfach überschreiben einer (oder beide Dateien Adium.png ) zu einem Ort der Bilder "flash" erhalten.
Suchen Sie die Dateien XIB
Auch die Schnittstellen mit Interface Builder gebaut werden können in ihrer Gesamtheit entfernt werden, wenn es für notwendig erachtet wird. ) con interfaccia XIB , lo selezioniamo, scegliamo Get Info dal menu contestuale, rendiamo il file localizzabile, aggiungiamo la localizzazione in italiano: Das Verfahren ist identisch mit dem grafischen Fähigkeiten durchgeführt: Fügen Sie ein ViewController (zB infoViewController ) XIB-Schnittstelle, wählen wir sie, wählen Sie Get Info aus dem Kontextmenü, geben Sie der Datei lokalisierbar, fügen Sie die italienische Lokalisierung:

Klicken Italiano oder Italienisch öffnet Interface Builder! ) all'interno della classica cartella Classes . Dieses Mal das Dateisystem, werden Sie feststellen, dass Sie zwei Verzeichnisse (erstellt English.lproj und Italian.lproj ) innerhalb der klassischen Klassen-Ordner. Beide haben ihre Dateien infoViewController.xib . Der Komfort in diesem, deutlich in den Code behoben, und wann wir unsere Controller-Code instanziieren wir eine "saubere" wie diese haben:
1 2
| [ InfoViewController alloc ] ; InfoViewController * info = [InfoViewController alloc]; info.view ] ; [Self.view addSubview: info.view]; |
Wie Sie sehen können gibt es keine Spur von Aussage über die Lage, völlig vom System verwaltet. Die beiden Schnittstellen, natürlich, können ganz unterschiedlich sein, wie wirksam sind als zwei separate XIB-Datei.
Fortsetzung ...
Vielleicht sollte ich schreiben "Sehr sehr sehr kurze Schnipsel", jedoch ist eine ausgezeichnete und komfortable "Trick" zu zeigen, was ich bin. Ausführen der "zwei" Zeilen Code unten gezeigt, können Sie die Ausgabe eines beliebigen URL und manipulieren.
Fortsetzung ...
Führen Sie eine Methode, nach n Sekunden
Die ganze Familie performSelector ist wirklich interessant und kann in einer Vielzahl von Fällen nützlich. Die einfachste und häufigste Anwendung ist wie folgt:
1 2 3 4 5
| @selector ( myMethod ) withObject : nil afterDelay : 3 ] ; [Self performSelector: @ selector (myMethod) withObject: nil afterDelay: 3]; / / void ) myMethod { - (Void) {myMethod "Hello World!" ) ; NSLog (@ "Hallo Welt!"); } |
Sind jedoch der Ansicht, dass der "Timer" ist nicht korrekt. Dieses Verfahren sollte daher verwendet werden, wenn es eine "erhebliche" zeitliche Präzision erforderlich ist.
Rufen Sie die Version des
1 2
| version = [ [ [ NSBundle mainBundle ] infoDictionary ] objectForKey : @ "CFBundleVersion" ] ; NSString * version = [[[ NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleVersion"]; "versione = %@" , version ) ; NSLog (@ "Version =% @", Version); |
JA, wahr oder TRUE?
e TRUE sono in pratica la stessa edentica cosa: Going to Kamm durch die Kernel Apple iPhone können Sie erkennen, dass YES , true , und TRUE grundsätzlich dasselbe Edentia:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| / / Definition von JA # Define YES (BOOL) 1 # Define NO (BOOL) 0
/ / Definition der wahren # Define TRUE 1 # Define false 0
/ / Definition von TRUE # If! Defined (TRUE) # Define TRUE 1 # Endif
# If! Defined (FALSE) # Define FALSE 0 # Endif |
Zumindest für den Moment ...
Vibration
1 2 3
| # Import <AudioToolbox/AudioToolbox.h> / / ; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); |
CGImageRef Zeiger von einem UIImage
1 2 3 4
| [ UIImage imageNamed : @ "LittleHeart.png" ] ; UIImage * heart = [UIImage imageNamed: @ "LittleHeart.png"]; heart CGImage ] ; CGImageRef image = [CGImage Herz]; / / Das Bild kann nun "gerastert" werden auf einem CGContextRef CGRect ) { 0 , 0 , 100 , 100 } , image ) ; CGContextDrawImage (c, (CGRect) {0, 0, 100, 100}, Bild); |
Animationen
1 2 3 4 5
| nil context : NULL ] ; [UIView beginAnimations: nil context: NULL]; 1.5 ] ; [UIView setAnimationDuration: 1,5]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; / / ... ; [UIView commitAnimations]; |
NSLog
1 2 3
| "NSString object %@ " , myString ) ; NSLog (@ "NSString Objekt% @", myString); "Float: %f " , myFloat ) ; NSLog (@ "float:% f", myFloat); "Integer: %i " , myInt ) ; NSLog (@ "Integer:% i", myInt); |
RGB-Wandler UIColor
1
| # Define RGBA (r, g, b, a) [UIColor colorWithRed: r/255.0 grün: blau g/255.0: b/255.0 alpha: a] |
Parameter an eine NSTimer
Unter Ausnutzung der Parameter userInfo können Sie einen Zeiger auf ein Objekt, um unsere Methode durch den Timer aufgerufen senden.
1 2 3 4 5 6 7 8 9 10 11 12 13
| scheduledTimerWithTimeInterval : 1 target : self selector : @selector ( timerMethod ) userInfo : objectPointer repeats : YES ] ; [ NSTimer scheduledTimerWithTimeInterval: 1 Ziel: self selector: @ selector (timerMethod) userInfo: objectPointer wiederholt: YES]; / / ... void ) timerMethod : ( NSTimer * ) timer { - (Void) timerMethod: ( NSTimer *) Timer { / / Hole den Zeiger auf mein Objekt timer userInfo ] ; objectPointer = [Timer userInfo]; / / Oder myMethod ] ; [[Timer userInfo] myMethod]; [ [ timer userInfo ] myProperty ] ; int a = [[Timer userInfo] myProperty]; / / Welche ist die gleiche [ objectPointer myProperty ] ; int a = [objectPointer myProperty]; } |
Laufzeit
Hier ist eine einfache Möglichkeit, eine kurze Zeit benötigt, um die Geschwindigkeit der Ausführung des Codes zu überprüfen, berechnet:
1 2 3 4
| ; CFAbsoluteTime initialTime CFAbsoluteTimeGetCurrent = (); / / ... Frack ; CFAbsoluteTime finalTime CFAbsoluteTimeGetCurrent = (); "Tempo trascorso %f" , finalTime - initialTime ) ; NSLog (@ "verstrichene Zeit% f", finalTime - initialTime); |
Fortsetzung ...
Ich möchte zeigen und diskutieren einige Beispiele, wie man hinzufügen und manipulieren Eigenschaften in Objective-C-Klasse. : Ein klassisches Beispiel, genau, ist die folgende, in der Definition unserer Interface-Klasse definiert zwei Eigenschaften nome und cognome :
e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: In der Implementierung-Datei die Anweisung einfügen @synthesize , so dass Xcode für uns produzieren werden die Methoden getter -und setter bzw. zum 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 du gehst, um unsere Klasse MyClass , dass, wenn istanziaremo ist 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" @ Class TestViewController; NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate> UIWindow * window; * 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 ist das ä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 eine Irreführung der Gleichwertigkeit der "variable" interne (ivar) mit dem Namen des Immobilien-Objekt selber. Um zu verstehen, der Unterschied, wieder schlagen die gleiche wie Verzicht, dieses Mal, die @synthesize . . Nun, deshalb sollten wir darauf achten, dass die Methoden zu schreiben getter und setter . Zur weiteren betonen die Unterschiede, werden die internen Variablen durch Einfügen eines vor dem Namen unterstreichen umzubenennen. 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 Zeiger auf interne Variablen (incapsultate) geworden _nome und _cognome . . @property è scomparso, in quanto non serve più. Darüber hinaus gibt es vier Definitionen von Methoden, die unsere 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 Return; } / / Um "name" Set void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso _Name = StringaIngresso; } / / Für "Nachname" Get NSString * ) cognome { - ( NSString *) name { _cognome return; } / / Für "Nachname" Set void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
Geschrieben als eine Klasse genau wie die vorherigen genutzt werden können, nämlich:
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 gleichbedeutend ist mit:
@ "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" Methoden get und set , Hervorhebung - auch mit dem Zusatz dell'underscore - die Unterschiede zwischen den 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 der funktionalen Ebene der persönlichen Nutzung der Methoden get und set ermöglicht Echtzeit-Steuerung der Daten vor ihrer Einstellung (oder vor seiner Lesung) und dann eine echte Kapselung der internen Variablen zu schützen.
Zum Beispiel wäre es möglich, den Durchgang der leeren Saiten, um eine Immobilie 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 Variation
Wenn Sie die internen Variablen mit dem verwenden möchten unterstreichen vor (wer rpoviene Adobe Actionscript könnte auch verwendet werden) ist nicht notwendig, die Verwendung der Richtlinie aufzugeben @synthesize . Xcode macht es möglich, "merge" den oben genannten Verfahren:
1 2
| _nome; @ Synthesize name = _Name; _cognome; @ Synthesize name = _cognome; |
. Dabei haben wir den Zeiger auf die intern verwenden könnten _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 . Außerdem, es ist wahr, dass die Verwendung von @synthesize automatische Generierung Methoden (Nachrichten) von produziert getter -und setter ist es auch wahr, dass, wenn er sie nicht findet, so, wenn Sie "implementieren" eine Methode für Ihren gewünschten getter -und / oder setter können Sie dies tun, auch wenn Sie der Richtlinie verwendete @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. Darüber hinaus gibt es die Zugabe einer Methode 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 @ = "Preset Name"; "Cognome preimpostato" ; _cognome @ = "Preset Name"; } Rückkehr Selbst; } void ) dealloc { - (Void) {dealloc ; [_Name Release]; ; [_cognome Release]; ; [Super dealloc]; } NSString * ) nome { - ( NSString *) name { _Name Return; } void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "no name"; _Name = StringaIngresso; } NSString * ) cognome { - ( NSString *) name { _cognome return; } void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
, etc… In Zukunft werden wir dann sehen, die Details über die Eigenschaften readonly , retain , etc ... 
Fortsetzung ...
Unsere Website ist jetzt nur noch durch PCs angezeigt. Mit der Verbreitung von mobilen, dank Apples iPhone, den Zugriff auf die Website oder ein Blog wird zunehmend durch eine Vielzahl von mobilen Geräten durchgeführt. Es ist daher notwendig, zu wissen, wie viele Web-Entwickler und abzufangen Identifizierung der verschiedenen "Agenten", dh die Mittel, mit denen ein Benutzer betrachten (Browsing) unseren Seiten.
Fortsetzung ...
non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! Die Zustände UIControlStateSelected oder UIControlStateHighlighted nicht funktionieren, wenn ein UIButton -Modus eingestellt ist UIButtonTypeCustom ! Oder besser gesagt, nicht funktionieren (weil für andere Arten von Button vorbehalten), zum Beispiel zu einer Zwei-Staaten-Schaltfläche zu erstellen: toggle beachten. Wenn wir zwei Bilder (und stato1.png stato2.png) für unsere Button erstellt haben, können wir wie folgt vorgehen:
1 2 3
| / / Die Header-Dateien, dass wir eine globale Variable für usaremo erstellen / / Check der Toggle wurden ToggleFlag BOOL; |
Nun erstellen wir unseren Button:
1 2 3 4 5 6 7 8 9
| / / Wir schaffen eine Taste und legen wir es zunächst in den Zustand "stato1.png" / / Edit initWithFrame: (CGRect) {} 100,100,50,50 mit dem Standort 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: @ "," Forst: UIControlStateNormal]; [ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton SetBackgroundImage: [UIImage imageNamed: @ "stato1.png"] Forst: UIControlStateNormal]; self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [ToggleButton addTarget: self Aktion: @ selector (onToggle:) forControlEvents: UIControlEventTouchUpInside]; toggleButton ] ; [Self.view addSubview: ToggleButton]; |
Wenn Sie auf den Button klicken, wird eine Nachricht zu verwaltenden senden 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 Toogle toggleFlag = toggleFlag!; [ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked SetBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png" @ "stato2.png"] Forst:? UIControlStateNormal]; } |
Fortsetzung ...
Eine Alternative sehr einfach zu laufen einen Stream einer MP3-Datei auf dem Apple iPhone können sein:
Fortsetzung ...
o CGPoint , ad esempio. Die Syntax NSLog(@"%@", ... ); funktioniert und wird verwendet, um Informationen über Objekte zu erhalten, aber nicht auf C-Datentypen wie struct Arbeit CGRect oder CGPoint , zum Beispiel. o NSStringFromCGPoint : Um die Vorteile zu nehmen NSLog(@"%@", ... ); auch auf C-Stil Strukturen können auf Konvertierungsfunktionen wie verlassen 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, dieses Verfahren schreibt der kleine nützliche Makros wie zu verbessern:
1
| # Define NSLogRect (rect) NSLog (@ "% s (% 0.0f,% 0.0f)% 0.0f% 0.0fx", # rect, rect.origin.x, rect.origin.y, rect.size.width , rect.size.height) |
Oder:
1 2 3 4
| # Define 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) |
Fortsetzung ...
Neueste Kommentare
Simon : Es ärgert gestört wieder ein und verwenden, die Platz für diese Dinge ... aber es funktioniert nicht ...
Giovambattista Fazioli : @ Simon: Was könnte darauf zurückzuführen sein, die Syntax, die ich verwendet, die speziell für PHP 5 +,...
Simon : Ich habe versucht gestern Abend, alles in functions.php, okay, jquery Formulare und Tabs jQueryUI ihnen ...
Giovambattista Fazioli : @ Simon: Ich empfehle Reinigung zu einem Code wie in ein ...
Simon : @ Giovambattista Fazioli: Vielen Dank für Ihre Geduld, es ist alles klar ... jetzt fühle ich mich jetzt ...