2009-10-23 6 views
1

Je me demandais si quelqu'un connaissait de bonnes ressources/tutoriels en ligne pour créer des vues et des contrôleurs par programme plutôt que via le constructeur de l'interface. Tout ce que j'ai regardé utilise le constructeur de l'interface et les plumes créées, alors que le BI est correct. Je voudrais avoir la possibilité de les développer manuellement (à la fois pour des raisons pratiques et une bonne compréhension de la façon dont celui que vous obtenez de glisser et laisser tomber des choses).iPhone façonné à la main vues/contrôleurs

Mon arrière-plan est en java et je trouve qu'il est lent et frustrant à l'aide du constructeur d'interface pour développer des vues de la façon dont je parfois les faire en Java, ce soit

  • générer la source programatically d'un domaine modèle, puis modifier le résultat si requried
  • utilisent des méta-données et/ou la réflexion et ajouter dynamiquement les contrôles à la vue

de plus, une fois que je l'ai créé une vue est là, je peux ajouter de toute façon à le constructeur de l'interface à ma est-il disponible à utiliser comme vue secondaire sur une autre vue?

Merci, Vic

Répondre

1

La méthode Interface Builder crée des objets «lyophilisés» qui sont recréés lors de l'exécution lorsque vous initialisez l'objet à partir de la NIB. Il fait toujours les mêmes alloc et init choses, en utilisant NSCoder objets pour mettre les objets en mémoire. Si vous souhaitez disposer d'un contrôleur de vue basé sur un NIB particulier, vous pouvez remplacer la méthode init par défaut et l'initialiser en fonction de la NIB de ce contrôleur de vue. Par exemple:

@implementation MyViewController 
-(id) init { 
    if (self = [super initWithNibName:@"MyViewController" bundle:nil]) { 
     //other setup stuff 
    } 
    return self; 
} 

Et quand vous voulez afficher le MyViewController, vous simplement appeler quelque chose comme ceci:

- (void) showMyViewController { 
    MyViewController *viewController = [[[MyViewController alloc] init] autorelease]; 
    [self presentModalViewController:viewController animated:YES]; 
} 

Maintenant, si vous voulez créer votre point de vue manuellement au lieu de dans Interface Builder, vous n'avez pas besoin de changer votre méthode -showMyViewController.Débarrassez-vous de votre -init override, et au lieu substituer la méthode -loadView de votre MyViewController pour créer par programmation:

- (void) loadView { 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(320,460)]; 
    self.view = view; 
    [view release]; 

    //Create a button 
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [myButton addTarget:self action:@selector(pressedButton) forControlEvents:UIControlEventTouchUpInside]; 
    [myButton setTitle:@"Push Me!" forState:UIControlStateNormal]; 
    myButton.frame = CGRectMake(100,230,80,44); 
    [self.view addSubview:myButton]; 
} 

Cet exemple montre comment créer la vue et ajouter un bouton à lui. Si vous souhaitez conserver une référence, déclarez-le de la même manière que si vous utilisiez un NIB (sans IBOutlet/IBActions) et utilisez self lors de l'affectation. Par exemple, votre tête pourrait ressembler à ceci:

@interface MyViewController : UIViewController { 
    UIButton *myButton; 
} 

- (void) pressedButton; 

@property (nonatomic, retain) UIButton *myButton; 

@end 

Et votre classe:

@implementation MyViewController 
@synthesize myButton; 

- (void) loadView { 
    //Create the view as above 

    self.myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [myButton addTarget:self action:@selector(pressedButton) forControlEvents:UIControlEventTouchUpInside]; 
    [myButton setTitle:@"Push Me!" forState:UIControlStateNormal]; 
    myButton.frame = CGRectMake(100,230,80,44); 
    [self.view addSubview:myButton]; 
} 

- (void) pressedButton { 
    //Do something interesting here 
    [[[[UIAlertView alloc] initWithTitle:@"Button Pressed" message:@"You totally just pressed the button" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK",nil] autorelease] show]; 
} 

- (void) dealloc { 
    [myButton release]; 
    [super dealloc]; 
} 
+0

Merci pour cela, c'est très utile. – vickirk

0

J'ai eu le même problème il y a quelques mois quand je voulais faire tout le développement de l'iPhone dans Emacs. Pour faire une histoire courte: Je ne développe plus pour l'iPhone plus :)

Je vous suggère toujours de vérifier ma question et quelques réponses utiles here.

+0

Il ne demande pas d'un environnement de développement, plutôt que moyen de construire son point de vue (programme ou graphiquement). N'a rien à voir avec un éditeur de texte. – jbrennan

0

En général, je n'utilise pas trop le constructeur Interface pour le développement de l'iPhone. Habituellement je vais créer un contrôleur de vue dans le code comme ceci

MyUIViewControllerSubclass *controller = [[MyUIViewControllerSubclass alloc] initWithNibName:nil bundle:nil]; 
controller.someProperty = myModel; 
[self presentModalViewController:controller]; 
[controller release]; 

Ou quelque chose le long de ces lignes. Typiquement, je crée une sous-classe de UIViewController et c'est là que je dispose mes vues et autres. Les vues sont des sous-classes de UIView (soit des choses que Apple fournit comme UIButton etc., ou quelque chose que j'ai moi-même créé). Si vous lisez sur les deux UIViewController et UIView vous devriez avoir une assez bonne idée de comment cela fonctionne.

Questions connexes