it-swarm.com.de

Ansichten programmgesteuert erstellen IOS (wie funktioniert es)?

Ein kleiner Hintergrund: Ich gehe die iTune-Videos des CS193P durch und habe mich am längsten an der Aufgabe 3 festgesetzt. Grundsätzlich fordert Sie die Zuweisung auf, programmgesteuert eine benutzerdefinierte Ansicht zu erstellen, um eine Form auf dem Bildschirm anzuzeigen. Ich verwende übrigens keine View Controller.

Ich konnte meine Ansicht nicht anzeigen, bis ich schließlich ein Ansichtsobjekt in Interface Builder gezogen und den Objektnamen in meine benutzerdefinierte Ansichtsklasse geändert habe. Meine Frage ist also, wenn Leute sagen, dass sie programmgesteuert eine Ansicht erstellen, sagen sie einfach, dass sie die Klasse manuell erstellen, aber wenn Sie sie anzeigen müssen, verwenden Sie IB? Ich kann nicht anders, als wenn ich etwas missverstanden habe?

edit: lass mich klarer sein. Meine benutzerdefinierte Ansicht wurde mit einem Rahmen von 0, 0, 200, 150 initialisiert, und drawRect wird überschrieben, um ein Quadrat darin zu zeichnen. Meine Ansicht wird nicht einmal angezeigt, wenn Sie versuchen, sie zum Hauptfenster in meinem Controller hinzuzufügen:

    UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];

Wenn Sie jedoch eine Ansicht in IB ziehen und die Klasse in meine Ansichtsklasse ändern, wird sie in Ordnung angezeigt.

Bearbeiten: Code hinzugefügt. Dies ist die awakeFromNib-Methode meines Controllers, bei der die Ansicht gezeichnet werden soll.

    - (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];  
}

Teil der updateInterface-Methode meines Controllers:

- (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

Die PolygonView wird initialisiert, aber drawRect wird nicht aufgerufen.

16
subject_x

Um noch spezifischer auf Ihre Frage einzugehen, wäre dies die Syntax

UIWindow* window = [UIApplication sharedApplication].keyWindow;

UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( 0, 0, 200, 150)];
//add code to customize, e.g. polygonView.backgroundColor = [UIColor blackColor];

[window addSubview:polygonView];
[polygonView release];

Dies ist ein Muster, das Sie nicht nur für diese, sondern für nachfolgende Unteransichten verwenden werden. Ein weiterer Hinweis ist bei vielen Vorlagen, der viewController ist bereits mit einer eigenen Ansicht eingerichtet. Wenn Sie eine benutzerdefinierte Ansicht erstellen möchten, erstellen Sie sie wie oben, aber anstelle der oben beschriebenen Methode legen Sie die Ansicht "viewControllers" wie folgt fest:

viewController.view = polygonView;

Viel Glück!

17

Dies ist eine alte Frage, aber ich bin nicht sicher, ob er die erwartete Antwort bekam - es klingt, als wäre er auf das gleiche Problem gestoßen, mit dem ich eine UIViewController-Unterklasse erstellt hatte, eine UIViewController in einer Interface-Builder-Spitze schlug, aber dann nicht gelang finde heraus, wie man die beiden zusammenarbeiten lässt.

Wenn Sie die Spitze separat erstellt haben (also nicht neben Ihrer Klasse für Sie gemacht), müssen Sie darauf achten, dass Sie auf den UIViewController klicken, den Sie im Schnittstellen-Builder platziert haben, und dann im Eigenschaftenbereich auf die dritte Schaltfläche ("Benutzerdefinierte Klasse") klicken '). Die Variable Class ist die Standardbasisklasse UIViewController etc. Öffnen Sie einfach diese Dropdown-Liste. Sie sehen eine Liste aller benutzerdefinierten Unterklassen. Wählen Sie sie aus und volla - Sie haben Ihr benutzerdefiniertes Element mit der Benutzeroberfläche verknüpft.

Ich hoffe, das erspart jemandem die Tage, die ich brauchte, um es herauszufinden. Ich fand einige dumme wunderbare Wege, es zu umgehen, bis ich die einfache Lösung erkannte.

4
RoyalFool

hallo fügen Sie einfach diesen Code hinzu, 

[window bringSubviewToFront:polygonView];

right after,
 [window addSubview:polygonView];
2
Saad Tasawar

Sie benötigen eine Ansicht (oder ein Fenster), um eine Unteransicht hinzuzufügen. Die normale Syntax sieht so aus:

UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds];
[mainView addSubview:newView];
[newView release];

Wenn Sie über ein benutzerdefiniertes Objekt verfügen, das von UIView erbt, würden Sie dieses natürlich anstelle von UIView verwenden. Wenn Sie ein neues Projekt starten, erstellen Sie eine "View-basierte Anwendung", die Sie mit einem View-Controller mit einer zugehörigen Ansicht starten (auf die mit "CustomViewController.view" zugegriffen werden kann, wodurch "mainView" im Code-Snippet ersetzt wird über).

Wenn Sie die Ansicht beim Start der App programmgesteuert erstellen möchten, geben Sie den Code in die Methode "- (void) viewDidLoad" Ihres View-Controllers ein.

2
Ned

Haben Sie die Hintergrundfarbe Ihrer Ansicht auf etwas Unterscheidendes gesetzt?

Sind Sie sicher, dass Ihre Ansicht nicht angezeigt wird, oder können Sie sie nur nicht sehen? Fügen Sie ein NSLog in die drawRect: -Methode Ihrer Ansicht ein (wenn Sie eine benutzerdefinierte Ansichtsklasse verwenden).

0
fzwo

Ich hatte kürzlich ein sehr ähnliches Problem, und hier hat sich Folgendes herausgestellt: .__: Wenn Sie in Xcode 4.3.2 mit einer 'leeren Anwendung' beginnen, müssen Sie Ihre Ansicht als Stammansicht mit der setRootViewController-Methode als Hauptansicht festlegen anstelle von addSubview. So:

// Initialize myView and then
[window setRootViewController:myView];
// instead of [window addSubview:myView];
// the rest as normal...
[window makeKeyAndVisible];

Danach können Sie die addSubview-Methode verwenden, um weitere Ansichten hinzuzufügen.

0
Matjan

Irgendwo in Ihrer aktiven Controller-Klasse können Sie der aktuellen Ansicht auf oberster Ebene eine benutzerdefinierte Ansicht hinzufügen.

[ myCurrentTopView addSubview: myNewCustomView ];

Es hilft, diese benutzerdefinierte Ansicht zuerst zuzuordnen und zu initialisieren.

Sie können dann in drawRect dieser benutzerdefinierten Ansicht eine Zeichnung auslösen, indem Sie Folgendes ausführen:

[ myNewCustomView setNeedsDisplay ];
0
hotpaw2

anruf

[super drawRect];

vor Ihrem benutzerdefinierten Code in drawRect: body.

0
DaddyM