Category 'iPhone'


How to set XCode to use the iPhone instead of the simulator

Screencast

More ...

iPhone: Create a way to respond to events that cross class

Normally an event, which is nothing but a message is fixed (set and implemented) in the same class or context, the function or procedure "caller". o in un UIViewController . For example if we add a button UIButton via code (programmatically), we can find our class in a UIView or a UIViewController . In both cases the task allocation and initialization of the button will be followed by the setting of target that should receive a message when it "clicks" the button, type:

1
2
3
4
5
6
7
8
9
[ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton * button = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Press me" forState : UIControlStateNormal ] ; [Button setTitle: @ "Press me" forState: UIControlStateNormal];
/ / Decide who should receive the message UIControlEventTouchUpInside
self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget button: self action: @ selector (onButtonClicked) forControlEvents: UIControlEventTouchUpInside];
/ / ...
void ) onButtonClicked { - (Void) {onButtonClicked
/ / ...
}

Line 5 of the code shown above decides who (subject) and what (method) "call" when our button is pressed. In the example illustrated above is also known that the setting pressure of the message is sent to the method onButtonClick implemented below, and then forming part of the same context (or class). potremmo inviare il nostro messaggio ad un qualsiasi altro oggetto, posto quindi al difuori del contesto in uso. The first consideration is obvious that we can do, then, is that by altering the parameters self and action we can send our message to any other object, then place also outside of the context in use. : Here's an example: a class UIApplicationDelegate create a UIViewController :

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

associata al UIViewController stesso: The SplashScreenController exposes a method that allows you to animate the UIView associated with UIViewController same:

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 terminated");
}

. The above code shows a method defined inside the class SplashScreenController type UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . It does nothing but animate the UIView animating it down, and when the animation is complete, call (send a message to itself - hence self ) onAnimationFinished defined below, is part of the class always SplashScreenController . , non saremo informati della fine dell'animazione: It follows that in our myAppDelegate , when we invoke the method animateBackgroundDown , we will not be informed of the end of the animation:

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

What we want, instead, is to create a new version of animateBackgroundDown as to tell him where to send the message end animation and which method to call. In practice we want to make sure you can write in our class 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 terminated");
}

, bensì in myAppDelegate . This time the method onAnimationFinished is not in the UIViewController , but in myAppDelegate . nel modo seguente: To do this simply change the method animateBackgroundDown in UIViewController as follows:

1
2
3
4
5
6
7
8
9
10
11
12
/ /
/ / SplashScreenController.m
/ /
void ) animateBackgroundDown : ( id ) target selector : ( SEL ) selector { - (Void) animateBackgroundDown: (id) target selector: (SEL) selector {
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: selector];
CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480};
; [UIView commitAnimations];
}

). Now we have a method that accepts the "context" ( target ) and the method to call ( selector ). a qualsiasi altro “oggetto” / classe in grado di riceverlo. Now, when the animation ends, the message AnimationDidStop will be sent to myAppDelegate any other "object" / class that can receive it.

More ...

Objective-C: an alternative to using CGRectMake

CGRectMake() is a function (actually an inline # define) used a lot especially when objects are created by code or graphical user interface. o UIImageView . CGRectMake() restituisce una struct (struttura di tipo) CGRect : Its use is therefore often associated initialization components of UIKit , but also to simple UIView or UIImageView . CGRectMake() returns a struct (structure type) CGRect :

1
2
3
4
5
struct {CGRect
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;

: Which in turn is composed of two different struct CGPoint and CGSize :

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

/ * Sizes. * /

struct {CGSize
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;

. That, in their turn again, contain types CGFloat , or types float . If we analyze the code of CGRectMake () are:

1
2
3
4
5
6
7
8
CG_INLINE CGRect
CGRectMake (CGFloat x, y CGFloat, CGFloat width, height CGFloat)
{
CGRect rect;
y; rect.origin.x = x; rect.origin.y = y;
height; rect.size.width = width; rect.size.height = height;
return rect;
}

It follows, therefore, that this part of the code:

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: @ "Press" forState: UIControlStateNormal];
gbutton ] ; [MainWindow addSubview: gbutton];

It could rightly be written as:

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: @ "Press" forState: UIControlStateNormal];
gbutton ] ; [MainWindow addSubview: gbutton];

Just to speed things up 'the code is running ... :)

More ...

XCode: Tips on Debugging Preferences

Using the Xcode Preferences you can set the behavior of the atmosphere during the debugging phase of an iPhone application. The default settings, in fact, are very uncomfortable when you try and try again an application, for example, after launching our application, you must manually open the Console window to see the output of various NSLog() . Xcode also lets the previous sessions so we had to clean out the window by hand. Fortunately, you can solve the problem by turning the Preferences:

xcode-preferences

As shown in the figure above, simply select an item from the Start Menu On the debug window to decide which open automatically on startup of our appicazione (I set Console & Debugger but you can choose those that best suits you). On the right, then we find Auto Clear Debug Console, so you always start with the Console clean.

More ...

iPhone: extend a class UIView

creato. I want to show how it is possible, in a simple and rapid, extend a class UIView in such a way that responds to a new initialization method further containing the object code to customize UIView created. As some of you probably know, Objective-C does not support a single manufacturer as in other object oriented languages ​​(such as Adobe ActionScript or PHP5). E 'can, in fact, create an instance of a class manually invoking different manufacturers (virtually infinite). . Normally we are used to create objects UIView with the classic initWithFrame . Suppose, however, we want to create a new class of visual objects, starting from a UIView , with some addition, such a label is incorporated. . Basically what we want is that instantiating our object it creates, as well as the UIView , an object of type UILabel . For example we might want to get to the end:

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

: To do this simply create a new class of type UIView and 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) frame label: ( 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]) {
/ / Initialization code
}
return self;
}

/ /
/ / Our new initializer
/ /
id ) initWithLabelDefine : ( CGRect ) frame label : ( NSString * ) labelDefine { - (Id) initWithLabelDefine: (CGRect) frame label: ( NSString *) {labelDefine

self = [ super initWithFrame : frame ] ) { if (self = [super initWithFrame: frame]) {
/ / Here you can decide how to behave, I for
/ / I got the same frame security in the past
/ / Input but I reset the x and 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];
}
return self;
}

void ) drawRect : ( CGRect ) rect { - (Void) drawRect: (CGRect) rect {
/ / Drawing code
}

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

@ End

At the time of the creation of our new class, we could use:

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

More ...

iPhone SecondApp: Guess the number - Part 2

As mentioned FirstApp iPhone: Guess the number - Part 1 we see how to make an application for the Apple iPhone without using Interface Builder! Indeed, we will eliminate physical files created by Interface Builder wizard Xcode. At the end of this post, then, we have an application identical in all respects, to those built in the first part, with the difference that we will achieve all our visual components, including the Main Window, for complete code.

The application already made, if you just want to download, is available on my Google Code repository:

I would like to point out immediately as the ZIP of this example weighs less than the last time! :)

We create the project

We start by creating our project SecondApp (to distinguish it from FirstApp), although this time choose Window-based Application:

newproject

Now let's delete everything related to Interface Builder. : eliminatelo anche dal file system, quindi selezionate Also Move to Trash . Eliminate the file MainWindow.xib , located in the folder Resources , remove it from the file system also, and then select Also Move to Trash. nella casella Main nib file base name : Select then the file SecondoApp-info.plist and delete the reference to the MainWindow nib file in the Main box based name:

deleteib

At this point we no longer have any Window, at least through Interface Builder. , e modifichiamo la funzione main() in questo modo: So we open the file main.m , situated in Other Sources , and modify the function main() like 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];

/ / By removing the file. XIB we lost tracking
/ / The app delegate and then pass it to "hand"
UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int retVal = UIApplicationMain (argc, argv, nil, @ "SecondAppAppDelegate");

; [Pool release];
return retVal;
}

Open SecondAppAppDelegate.me then we create the main Window via code:

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

/ / Get the screen size (320, 480)
UIScreen mainScreen ] applicationFrame ] ; CGRect windowRect = [[UIScreen mainScreen] applicationFrame];
/ / Create a window - as we did bye bye to Interface Builder
[ [ UIWindow alloc ] initWithFrame : windowRect ] ; UIWindow mainWindow * = [[UIWindow alloc] initWithFrame: windowRect];
/ / Set the background of the Window to yellow, to differentiate
/ / The previous application FirstApp
[ UIColor yellowColor ] ] ; [MainWindow setBackgroundColor: [UIColor yellowColor]];

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

; [MainWindow release];
}

You can already test the application, if a window appears yellow you did everything right!

, necessario solo se si usa Interface Builder. In the file SecondAppAppDelegate.h we can eliminate IBOutlet , only needed if you use Interface Builder. Also add here that our global variables, the last time we had entered in the Controller. Then modify the file 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 * window;

UITextField * number;
UIButton * button;
int numeroACaso;
}

nonatomic, retain ) UIWindow * window; @ Property (nonatomic, retain) UIWindow * window;

void ) controllaNumero; - (Void) getNumber;

@ End

, in quanto non stiamo usando Interface Builder. Also in this case we have prepared the method definition controllaNumero , as the last time, but we have eliminated the indication IBAction , since we are not using Interface Builder.

We build the interface code

It 's time to create code using all components of our interface. ed inseriamo il seguente codice: We return in the file SecondAppAppDelegate.m , posizioniamoci before [mainWindow release] and insert the following code:

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
/ / Create the title bar
[ [ 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: @ "Guess a number"];
navigationItem animated : NO ] ; [MyNavigationBar pushNavigationItem: navigationItem animated: NO];
myNavigationBar ] ; [Window addSubview: myNavigationBar];

/ / Create the label
[ [ 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 = @ "iPhone has designed a number from 1 to 10, try to guess?"
myLabel ] ; [Window addSubview: myLabel];

/ / Create text input
UITextField alloc ] initWithFrame : CGRectMake ( 10 , 120 , 300 , 30 ) ] ; number = [[UITextField alloc] initWithFrame: CGRectMake (10, 120, 300, 30)];
numero.borderStyle = UITextBorderStyleRoundedRect;
numero.textAlignment = UITextAlignmentCenter;
numero.keyboardType = UIKeyboardTypeNumberPad;
"Inserisci il numero" ; numero.placeholder = @ "Enter number";
numero ] ; [Window addSubview: number];

/ / Create the button
UIButton buttonWithType : UIButtonTypeRoundedRect ] ; button = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Premi qui" forState : UIControlStateNormal ] ; [Button setTitle: @ "Click here" forState: UIControlStateNormal];
self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget button: self action: @ selector (getNumber) forControlEvents: UIControlEventTouchUpInside];
bottone ] ; [Window addSubview: button];

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

della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Since the ' applicationDidFinishLaunching corresponds to viewDidLoad as last time, right after the [mainWindow release]; insert:

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

Now we can do is implement the method controllaNumero , which will be identical (apart from the prototype) to the one used last time:

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 (@ "Pressed button control number");
[ numero.text integerValue ] ; numeroInserito int = [numero.text integerValue];
message; NSString * message;
"Il numero inserito è %d" , numeroInserito ) ; NSLog (@ "The number entered is% d", numeroInserito);
numeroInserito <numeroACaso ) { if (numeroInserito <numeroACaso) {
"Troppo basso..." ; message = @ "too low ...";
( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) {
"Troppo alto..." ; message = @ "Too high ...";
( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) {
"Bravo hai indovinato" ; message = @ "Bravo you guessed it";
+ arc4random ( ) % 10 ; numeroACaso = 1 + arc4random ()% 10;
"Numero pensato %d" , numeroACaso ) ; NSLog (@ "Number% d thought," numeroACaso);
}
[ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc]
"Responso" initWithTitle: @ "Response"
message: message
delegate: nil
"OK" cancelButtonTitle: @ "OK"
] ; otherButtonTitles: nil];
; [AlertMessaggio show];
; [AlertMessaggio release];
"" ; numero.text @ = "";
}

We're done!

Conclusions and considerations

, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. This example does not make direct use of a UIView or UIViewController , because I wanted to leave it as simple and streamlined as possible and, also, to show that the elements are not always necessary. However, inserting objects directly in the window can have some sense in this example and other sporadic contexts. portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro. The use of UIView and UIViewController still bring benefits in many other cases, andin some are almost indispensable, as we will see in the future.

More ...

XCode: organize your code with the # pragma mark

XCode is a very powerful and versatile and provides the programmer with many useful features and simple to use. When writing complex code, or at least articulated, it becomes important to organize your code so you do not waste time searching functions scattered in long lines of code. After commenting, the first and most important thing to do, environment XCode provides guidelines (nice) to improve the usability and legginilità within the development. One of these is the directive #pragma mark that becomes very useful in organizing groups of the code and methods.

In the picture below you can see the code part of my project PragmaTest :

pragmamark-1

The top dropdown menu allows you to list all the methods of our class. Now if we plug our method over the directive #pragma mark which has a syntax:

1
# Pragma mark {label}

We obtain:

pragmamark-2

The first #pragma mark with a hyphen (-) inserts a separator line. The second is a text (label) to taste. You can add the following statement where you want, organizing the code as you see fit. In addition you can also insert multiple rows pragma, type:

1
2
3
4
5
6
# Pragma mark -
# Pragma mark / **
# Pragma mark * Using the pragma
# Pragma mark * on multiple lines of code
# Pragma mark * /
void ) mioMetodo { } - (Void) myMethod {}

More ...

XCode 3.1.3: Restore the 2.2.1 SDK

For developers only register has already been released a new version of the SDK for Apple iPhone, so it is now time to install the 3.0 SDK thus updating the entire development environment XCode to version 3.1.3. If you have already upgraded you will have noticed that creating a new project seem to missing the old SDK 2.2.1 (including other).

xcode313

In reality it's all here on our machine, you can just run a simple procedure to magically restore all our previous SDK, so try out our application for the Apple iPhone is the SDK 3.0 that with previous versions 2.2.1 and lower. Select the project, open the context menu and select Get Info:

xcode131menu

In the window that opens, the first General tab, select the lower Base SDK for All Configurations and restored the SDK 2.2.1 (or whatever).

xcode313info

Without that, magically, the menu will redisplay all the XCode SDK 3.0 including

xcode313ok

More ...

iPhone: all system fonts

The Apple iPhone provides a limited number of fonts to developers. The list of available fonts is easily achieved by code, as we shall see. If you want to use your own fonts, for example by including it in the resources, it is a little more articulate and conivolge also the issue of licenses (rights) on fonts "embeddati" ... we'll talk later. Returning instead to present the official font nell'Apple iPhone these are (click on image to enlarge):

iphonefonts

The Apple iPhone SDK allows access to the special system fonts. These are identified by particular constants and are:

1
2
3
[ UIFont boldSystemFontOfSize : 12.0 ] ; UIFont myBoldFont * = [UIFont boldSystemFontOfSize: 12.0];
[ UIFont SystemFontOfSize : 12.0 ] ; UIFont mySystemFont * = [UIFont SystemFontOfSize: 12.0];
[ UIFont italicSystemFontOfSize : 12.0 ] ; UIFont myItalicFont * = [UIFont italicSystemFontOfSize: 12.0];

If you actually get a pointer to a font odei shown in the image above just use:

1
[ UIFont fontWithName : @ "Helvetica-Bold" size : 22.0 ] ; UIFont myCustomFont * = [UIFont fontWithName: @ "Helvetica-Bold" size: 22.0];

As noted the management of the font is special, in addition to the family (Helvetica, Courier, etc ...) must specify the type (bold, italic, etc ...). In practice, therefore, a font must be provided with these features. The Helvetica, for example, is present with:

1
2
3
4
Helvetica
Helvetica-Bold
Helvetica-Oblique
Helvetica-BoldOblique

If you want to display your fonts directly on the iPhone, here's some useful code line:

1
2
3
4
5
6
7
8
9
10
11
12
listOfFonts = [ [ NSArray alloc ] initWithArray : [ UIFont familyNames ] ] ; NSArray * listOfFonts = [[ NSArray alloc] initWithArray: [UIFont familynames]];
subFontTypes; NSArray * subFontTypes;

int i = 0 ; i< [ listOfFonts count ] ; i ++ ) { for (int i = 0; i <[listOfFonts count]; i + +) {
"Font Family: %@" , [ listOfFonts objectAtIndex : i ] ) ; NSLog (@ "Font Family:% @", [listOfFonts objectAtIndex: i]);
NSArray alloc ] initWithArray : [ UIFont fontNamesForFamilyName : [ listOfFonts objectAtIndex : i ] ] ] ; subFontTypes = [[ NSArray alloc] initWithArray: [UIFont fontNamesForFamilyName: [listOfFonts objectAtIndex: i]]];
int j = 0 ; j< [ subFontTypes count ] ; j ++ ) { for (int j = 0, j <[subFontTypes count] j + +) {
"+----->Type: %@" , [ subFontTypes objectAtIndex : j ] ) ; NSLog (@ "+ -----> Type:% @", [subFontTypes objectAtIndex: j]);
}
; [SubFontTypes release];
}
; [ListOfFonts release];

With the SDK 2.2.1 on my mortgage, I got:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Font Family: Courier
+ -----> Type: Courier
+ -----> Type: Courier-BoldOblique
+ -----> Type: Courier-Oblique
+ -----> Type: Courier-Bold
Font Family: AppleGothic
+ -----> Type: AppleGothic
Font Family: Arial
+ -----> Type: ArialMT
+ -----> Type: Arial-BoldMT
+ -----> Type: Arial-BoldItalicMT
+ -----> Type: Arial-ItalicMT
Font Family: STHeiti TC
+ -----> Type: Light-STHeitiTC
+ -----> Type: Medium-STHeitiTC
Font Family: Hiragino Kaku Gothic Pron
+ -----> Type: HiraKakuProN-W6
+ -----> Type: HiraKakuProN-W3
Font Family: Courier New
+ -----> Type: CourierNewPS-BoldMT
+ -----> Type: CourierNewPS-ItalicMT
+ -----> Type: CourierNewPS-BoldItalicMT
+ -----> Type: CourierNewPSMT
Font Family: Zapfino
+ -----> Type: Zapfino
Font Family: Arial Unicode MS
+ -----> Type: ArialUnicodeMS
Font Family: STHeiti SC
+ -----> Type: Medium-STHeitiSC
+ -----> Type: Light-STHeitiSC
Font Family: American Typewriter
+ -----> Type: AmericanTypewriter
+ -----> Type: AmericanTypewriter-Bold
Font Family: Helvetica
+ -----> Type: Helvetica-Oblique
+ -----> Type: Helvetica-BoldOblique
+ -----> Type: Helvetica
+ -----> Type: Helvetica-Bold
Font Family: Marker Felt
+ -----> Type: Thin-MarkerFelt
Font Family: Helvetica Neue
+ -----> Type: HelveticaNeue
+ -----> Type: HelveticaNeue-Bold
Font Family: DB LCD Temp
+ -----> Type: DBLCDTempBlack
Font Family: Verdana
+ -----> Type: Verdana-Bold
+ -----> Type: Verdana-BoldItalic
+ -----> Type: Verdana
+ -----> Type: Verdana-Italic
Font Family: Times New Roman
+ -----> Type: TimesNewRomanPSMT
+ -----> Type: TimesNewRomanPS-BoldMT
+ -----> Type: TimesNewRomanPS-BoldItalicMT
+ -----> Type: TimesNewRomanPS-ItalicMT
Font Family: Georgia
+ -----> Type: Georgia-Bold
+ -----> Type: Georgia
+ -----> Type: Georgia-BoldItalic
+ -----> Type: Georgia-Italic
Font Family: STHeiti J
+ -----> Type: Medium-STHeitiJ
+ -----> Type: Light-STHeitiJ
Font Family: Arial Rounded MT Bold
+ -----> Type: ArialRoundedMTBold
Font Family: Trebuchet MS
+ -----> Type: TrebuchetMS-Italic
+ -----> Type: TrebuchetMS
+ -----> Type: Trebuchet-BoldItalic
+ -----> Type: TrebuchetMS-Bold
Font Family: STHeiti K
+ -----> Type: Medium-STHeitiK
+ -----> Type: Light-STHeitiK

More ...

How to remove NSLog () from source XCode

<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> a useful function during the early stages of a project for testing and debugging an application for Apple iPhone or, more generally, in XCode environment. Being just a function, just like the other, his presence will be felt even when releasing (release) our executable. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. It therefore becomes necessary to remove, in some way, all the lines of NSLog() from our code, because it is not necessary, either because the calls to NSLog() could affect the performance of our application, especially if we put NSLog() to 'inner loop.

Immediately rule out the solution to the "look" and "cancel" because one day there could be used again. We exclude also the solution of the "look" and "comments", uncomfortable for the same reason as before. Fortunately a clean, simple and are using the correct compiler conditionals. What we do in practice, and tell the compiler to exclude - if there is a specific condition - when compiling our source lines that contain NSLog() .

The compilations of directives and instructions of the conditional compiler, are a very powerful and widespread. Those coming from the development of the ANSI-C certainly know very well and will utilizzte in many situations. The peculiarity of these "instructions" resides in the fact, mentioned above, to be seen by the compiler and not executable. This feature makes them useful in many cases and can solve problems otherwise very annoying.

Let's see an example of code that, as predicted, you can "delete" by compiling pieces of code, in our case NSLog() :

1
2
3
4
5
6
# Define ACTIVE_NSLOG 1
/ / If the constant is defined ACTIVE_NSLOG fill
/ / Block of code between # ifdef and # endif
# Ifdef ACTIVE_NSLOG
" ... bla bla" ) ; NSLog (@ "... blah blah");
# Endif

). Conditional statements are part of the compiler of the same family as #define , also, in fact, are preceded by a "pound" ( # ). solo se ACTIVE_NSLOG è definito. In the example shown we have defined a constant ACTIVE_NSLOG ; subsequent lines of code tells the compiler to "include" line NSLog() only if ACTIVE_NSLOG is defined. If we took care, during the writing of our code, inserting calls to NSLog() within the block #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , just delete the definition of the constant ACTIVE_NSLOG to fade away, the next compilation, all our NSLog() .

A best and final

Let us now see how to set the XCode environment to improve even more what we have done here! First we choose a constant name that we use in our projects to exclude from the compilation NSLog() . o quello che preferite. You can choose the name that you like, from DEBUG to MIO_DEBUG or whatever you prefer. Open your project, new or old. Place all NSLog() within the block (or block):

1
2
3
# Ifdef MIO_DEBUG
" ... bla bla" ) ; NSLog (@ "... blah blah");
# Endif

Select the main file of your project, right click and choose the Get Info.

getinfo

This opens a window with information about the project:

userdefine

Select the Build tab, verify that you are in Debug configuration (this is the gem), go to the User-Defined section and add, via the button at the bottom left, a new field called OTHER_CFLAGS . At this assegnamoli the value -DMIO_DEBUG=1 . The syntax is -D{mia define}=1 .

This procedure has two advantages:

  1. We must not put in the code #define MIO_DEBUG 1 , but we do it through the project information. So, when we go to fill out the release version (the one without the NSLog() ) we must remember to delete the line #define MIO_DEBUG 1
  2. The constant is defined in relation to the configuration, in our case Debug. Then, passing to the Release configuration (release) will be absent and the constant rows with NSLog() will not be compiled

Conclusions

The above procedure may be useful in a moltidutine other cases, with NSLog() , have nothing to do. Conditional statements can help the compiler in a wide range of contexts. They are often used by programmers to determine the type of operating system version, the target, the presence of mathematical processors, while maintaining the same "identical" source.

To understand this, as an example, we can utilizzre our constant MIO_DEBUG also to intervene in other areas of the code:

1
2
3
4
5
6
7
8
9
10
/ / Debug if they win the game
/ / With a score of 100 instead of 10000 :)
# Ifdef MIO_DEBUG
score == 100 ) if (score == 100)
# Else
score == 10000 ) if (score == 10000)
# Endif
{
; [HaiVinto self];
}

To finish, here are some examples and variants:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/ / In general there is a
# If expression
/ / If statement similar to the traditional, so with a full expression

/ / Check if a constant is defined
# Ifdef constant

/ / Check if it is NOT a constant defined
# Ifndef constant

/ / Else
# Else

/ / Closing of the block
# Endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/ / For example ...
# Define DEBUG 1
# Define MIA_ALTRA_COSTANTE 5

...
# If DEBUG
/ / Fill in this
# Else
/ / Otherwise fill this other
# Endif

# If MIA_ALTRA_COSTANTE> 4
"..." ) ; NSLog (@ "...");
# Endif
1
2
3
4
# Ifndef INCLUDE_MIO_FILE
# Define INCLUDE_MIO_FILE
# Include "mio_file.h"
# Endif

More ...



Stop SOPA