Par programmation, la création de Vues en IOS (comment ça marche)?
Un peu de contexte: je vais à travers le CS193P iTune vidéos et j'ai été bloqué sur la mission 3 pour plus de temps. Fondamentalement, la mission vous demande de programmation pour créer une vue personnalisée pour afficher une forme sur l'écran. Je n'utilise pas de vue les contrôleurs de la voie.
Je ne pouvais pas obtenir mon point de vue à l'écran jusqu'à ce que j'ai traîné un objet de Vue dans Interface Builder et de changer le nom de l'objet à ma classe de vue personnalisée. Donc ma question est quand les gens disent de programmation pour créer une vue, sont-ils juste dire créer manuellement la classe, mais quand vous avez besoin de l'afficher à l'utilisation de l'IB? Je ne peux pas empêcher de se sentir comme j'ai mal compris quelque chose?
edit: laissez-moi être plus clair. Ma vue personnalisée a été initialisé avec une image de 0, 0, 200, 150 et drawRect est surchargé pour dessiner un carré. De mon point de vue ne s'affiche même pas si essayez de l'ajouter à la fenêtre principale à l'intérieur de mon contrôleur:
UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
Cependant, si l'usage faites glisser un point de vue de l'IB et de changer la classe de mon point de vue de classe, elle s'affiche bien.
Edit: Ajout de code. C'est mon contrôleur awakeFromNib méthode où la vue doit être établi.
- (void)awakeFromNib {
shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12];
polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
UIWindow *window = [UIApplication sharedApplication].keyWindow;
polygonView.backgroundColor = [UIColor blackColor];
[window addSubview:polygonView];
[self updateInterface];
}
Partie de mon contrôleur updateInterface méthode:
- (void)updateInterface {
[polygonView setPolygon:shape];
[polygonView setNeedsDisplay];
...
}
PolygonView.h
#import <UIKit/UIKit.h>
#import "PolygonShape.h"
@interface PolygonView : UIView {
IBOutlet PolygonShape *polygon;
}
@property (readwrite, assign) PolygonShape *polygon;
- (void)drawRect:(CGRect)rect;
@end
PolygonView.m
#import "PolygonView.h"
@implementation PolygonView
@synthesize polygon;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
nslog(@"initialized");
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGRect bounds = [self bounds];
[[UIColor grayColor] set];
UIRectFill(bounds);
CGRect square = CGRectMake(10, 10, 10, 100);
[[UIColor blackColor] set];
UIRectFill(square);
[[UIColor redColor] set];
UIRectFill(square);
NSLog(@"drawRect called");
}
@end
La polygonView est en cours d'initialisation, mais le drawRect n'est pas appelé.
Il a été créé dans le AppDelegate classe. Est-ce à dire que je #importer mes polygonView classe, et de la créer?
Il est intéressant de noter que si je mets de l'initialisation et de l'ajout de mon point de vue à la fenêtre de ma updateInterface méthode, elle fonctionne, mais seulement après que je clique sur un bouton qui appelle la méthode. Il semble que le code n'est pas en cours de processus dans awakeFromNib. Des idées?
Peut quelqu'un qui a été dans le cours d'avoir la gentillesse de partager leur code pour le contrôleur? Cette cession n'est pas pour la classe réelle; je suis juste en train d'apprendre l'Obj-C sur mon propre. À ce point, je comprends la plupart de ce qui se passe, mais il y a évidemment quelque chose qui me manque ici.
Le consensus suggère que ce que j'ai dans le code est correct, bien que personne ne semble être en mesure de me dire pourquoi le point de vue n'est pas établi, lorsqu'il est appelé à partir de mon contrôleur awakeFromNib méthode. Je vais réfléchir à ce problème résolu, étant donné que je vais apprendre sur la vue des contrôleurs de toute façon.
OriginalL'auteur subject_x | 2011-01-27
Vous devez vous connecter pour publier un commentaire.
Pour être encore plus précis à votre question, la syntaxe serait
C'est un modèle que vous utiliserez non seulement cela, mais les sous-vues par la suite. Aussi, une autre note, avec de nombreux modèles, le viewController est déjà mis en place avec son propre point de vue. Lorsque vous voulez procéder à un affichage personnalisé, vous créez comme ci-dessus mais au lieu de la méthode ci-dessus, vous définissez la viewControllers vue de l'affichage nouvellement créé de la sorte:
Bonne chance!
Hmmm... Ce qui se passe si vous commentez drawRect ou plus précisément l'appeler dans initWithFrame avec [auto drawRect];?
Rien d'autre ne se passe si je ne la supplante pas drawRect. Si je l'appelle drawRect de la initWithFrame méthode, j'obtiens une erreur d'exception: "la raison: '-[PolygonView drawRect]: unrecognized sélecteur envoyé à l'instance 0x4b58c70'"
OriginalL'auteur
C'est une vieille question, mais je ne suis pas sûr qu'il a eu la réponse qu'il attend - on dirait qu'il a couru dans le même problème j'ai fait lorsque j'ai créé un
UIViewController
sous-classe, buter unUIViewController
dans une interface builder plume, mais ensuite ne pouvait pas comprendre comment obtenir les deux travailler les uns avec les autres.Si vous avez pris la plume séparément (donc il n'est pas fait pour vous à côté de votre classe), alors vous ne devez pas oublier de cliquer sur le UIViewController vous avez placé dans interface builder, puis dans le panneau propriétés, cliquez sur le troisième onglet bouton (Classe Personnalisée'). Le
Class
sera la valeur par défaut de la classe de baseUIViewController
etc - il suffit d'ouvrir la liste déroulante et vous verrez une liste de toutes les sous-classes, sélectionnez-le, et volla - vous avez lié votre élément personnalisé à l'interface.Espoir qui sauve quelqu'un les jours, il m'a fallu pour comprendre, j'ai trouvé quelques bêtement de merveilleux moyens de faire autour d'elle jusqu'à ce que j'ai réalisé que la solution la plus simple.
OriginalL'auteur
Vous avez besoin à un point de vue (ou la fenêtre) pour ajouter une sous-vue. La normale de la syntaxe ressemble à ceci:
Bien sûr, si vous avez un objet personnalisé qui hérite de UIView, que vous l'utilisiez au lieu de UIView. Lorsque vous démarrez un nouveau projet, créer une "Vue de l'application", qui va vous commencez avec une vue contrôleur avec une vue associée (qui peut être consulté avec les "CustomViewController.vue", qui remplacerait "mainView" dans l'extrait de code ci-dessus).
Si vous voulez créer la vue par programme au démarrage de l'application, placez le code dans le "- (void)viewDidLoad" méthode de votre vue-contrôleur.
OriginalL'auteur
salut il suffit d'ajouter ce code,
OriginalL'auteur
Quelque part dans l'actif de contrôleur de classe, vous pouvez ajouter une vue personnalisée pour les courants de haut niveau de la vue.
Il permet d'allouer et initialiser cette coutume de voir la première.
Ensuite, vous pouvez déclencher le dessin dans cette vue personnalisée du drawRect en faisant un:
OriginalL'auteur
Avez-vous définir la couleur d'arrière-plan de votre point de vue à quelque chose de reconnaissable?
Êtes-vous sûr que votre vue ne s'affichent pas, ou est-il juste que vous ne pouvez pas le voir? Mettre un NSLog dans le drawRect: méthode de votre avis (si vous utilisez une classe de vue personnalisée).
Je retire ce que sur la vue de ne pas en cours d'initialisation. Il est et la NSLog message dans iniWithFrame est en train d'apparaître. C'est juste le NSLog message dans drawRect qui ne s'affiche pas. Je vois que mes données dans mon modèle est passé à mon avis correctement. Je ne peux pas comprendre pourquoi la fenêtre ne s'affiche pas mon point de vue.
Peut-être un peu plus de code serait de nous aider à analyser la situation.
OriginalL'auteur
J'ai eu un problème similaire récemment et voici ce qui a fonctionné pour moi:
Il semble qu'en cas de départ d'un "vide" sous Xcode 4.3.2 vous devez définir votre point de vue que la vue de la racine de votre fenêtre principale à l'aide de la setRootViewController méthode au lieu de addSubview. Donc:
Après cela, vous pouvez utiliser le addSubview méthode pour ajouter d'autres points de vue.
OriginalL'auteur
appel
avant votre code personnalisé dans drawRect: corps.
OriginalL'auteur