Aggiungere una cartella (es. di file HTML) senza perdere la struttura di sottocartelle

Chi ha voluto inserire una cartella di file HTML all’interno di un progetto Xcode si sarà presto accorto che i file vengono trattati come se fossero tutti dentro la cartella principale, e non distribuiti nelle eventuali sottocartelle. Questo crea problemi, ad esempio, nel linkare i file immagine nel file HTML (che andrebbe modificato ad hoc). Ma non solo.

Per ovviare a questo inconveniente è sufficiente ricordarsi di importare la cartella scegliendo l’opzione “Create folder references for any added folders ” (pur con l’opzione Copy items into destination group’s folder (if needed)” attivata).

Includere a posteriori una View in un UINavigationController

Può capitare di aver creato un UIViewController di prova e doverlo poi includere in una struttura di navigazione come un UINavigationController. Per non dover creare un nuovo progetto da template e includere i file già implementati, si può creare la struttura in pochi semplici passaggi.

Innanzitutto creiamo un RootViewController (comprensivo di file xib), ovver la vista che sarà quella principale dell’intera struttura.

Poi scriviamo nel AppDelegate.h il seguente codice:

1
2
3
4
5
6
7
8
9
#import <UIKit/UIKit.h>
 
@interface TNAAppDelegate : UIResponder <UIApplicationDelegate>
 
@property (strong, nonatomic) UIWindow *window;
 
@property (strong, nonatomic) UINavigationController *navigationController;
 
@end
#import <UIKit/UIKit.h>

@interface TNAAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) UINavigationController *navigationController;

@end

e nell’AppDelegate.m dovrà esserci il seguente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#import "AppDelegate.h"
 
#import "RootViewController.h"
 
@implementation AppDelegate
 
@synthesize window = _window;
@synthesize navigationController=_navigationController;
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
 
    RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}
#import "AppDelegate.h"

#import "RootViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize navigationController=_navigationController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

In questo modo viene creato via codice il navigationController con già caricato il primo viewController. Da questo basterà, tramite ad esempio il tocco di un pulsante o di una riga di tabella, fare un push alla view che volevamo includere nella struttura.