2009-07-22 14 views
1

Ich mache hier sicherlich etwas völlig Dummes, hoffentlich kann mir jemand was sagen! Zusammenfassend möchte ich programmgesteuert eine Unteransicht umschalten, wenn auf eine Schaltfläche geklickt wird (ich benutze eine segmentierte Schaltfläche). Es muss nicht animiert werden. Im Idealfall würde ich den Inhalt dieser Ansichten von einer Feder laden.Wie Unteransicht von UIView dynamisch (iPhone) festlegen?

Ich schiebe eine UIViewController-Unterklasse, initialisiert von einer Feder, zu einem navigationController. Diese Ansicht Controller & ist es "Standard" -Ansicht Display ok. Diese Feder enthält:

File's Owner [Class=my view controller subclass] 
First Responder 
View 
--Bar Segmented Control 
--View //this is the 'subview' whose content I want to toggle 

Vielleicht habe ich einen Fehler mit meiner IB Auslässen gemacht haben? Sie sind süchtig wie folgt:

switchableView <--> View 
view <--> View 

Und wo switchableView erklärt:

IBOutlet UIView *switchableView; 
... 
@property (nonatomic, retain) UIView *switchableView; 

ich ersetzt den Inhalt dieses UIView steckte. Zunächst einmal möchte ich es nur auf einen Standard setzen, wenn die Ansicht zum Leben erwacht. Sobald ich das verstanden habe, sollte es einfach sein, es zu etwas anderem zu tauschen, da ich das Ereignis, das durch den segmentierten Knopf erzeugt wird, bereits erfassen kann. Kann mir bitte jemand sagen, was ich falsch mache?

- (void)loadView { 
NSLog(@"loadView invoked"); 
[super loadView]; 
UIView *view = [[UIView alloc] init]; 
UILabel *label = [[UILabel alloc] init]; 
label.text = @"Segment1"; 
[view addSubview:label]; 
[switchableView addSubview:view]; //this is what I can't work out 
[view release]; 
[label release];  
} 

Diese Methode aufgerufen ist (wie viewDidLoad ist), aber weder Hilfe. Ich vermute, dass ich [switchableView addSubview:view] falsch mache. Ich habe auch versucht switchableView = view, aber eine lange Zeit in der Sicherheit von Java und Perl macht mich nicht 100% sicher, ob das richtig ist zu versuchen oder nicht!

Hier hofft jemand kann mich direkt setzen. Vielen Dank im Voraus,

Paul

Antwort

3

dies am Ende gelöst (mit dank an euch beide für die mir einige Hinweise) die UICatalog Beispielcode nach Inspektion. Die folgenden Werke:

- (void)loadView { 
    [super loadView]; 

    //define what will go in the seg1 view 
    UILabel *mylabel = [[UILabel alloc] initWithFrame:switchableView.frame]; 
    [email protected]"finally"; 
    self.seg1view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease]; 
    [self.seg1view addSubview:mylabel]; 
    [mylabel release]; 

    //define what will go in the seg2 view 
    UILabel *mylabel2 = [[UILabel alloc] initWithFrame:switchableView.frame]; 
    [email protected]"it works!"; 
    self.seg2view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease]; 
    [self.seg2view addSubview:mylabel2]; 
    [mylabel2 release]; 

    //default the switchable view to seg1view 
    [switchableView addSubview:self.seg1view]; 
} 

-(void)doTheSwitch { 
    if (segmentedButton.selectedSegmentIndex == 0) { 
     [seg2view removeFromSuperview]; 
     [switchableView addSubview:seg1view]; 
    } 
    if (segmentedButton.selectedSegmentIndex == 1) {  
     [seg1view removeFromSuperview]; 
     [switchableView addSubview:seg2view]; 
    } 
} 

wo die folgenden sind auch als Eigenschaften definiert (behalten, nonatomic)

IBOutlet UIView *switchableView; 
UIView *seg1view; 
UIView *seg2view; 
+0

Nur zur Info: "Ihre benutzerdefinierte Implementierung dieser Methode sollte nicht super heißen." http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/loadView –

0

Hier sind einige Auszüge, Ihnen zu helfen. Die erste ist einfach die Initialisierung für einen Navigationscontroller

// In AppDelegate.m 
-(void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    // Create and configure the main view controller. 
    UIViewController *firstViewController = [[UIViewController alloc] init]; 

    // Add create and configure the navigation controller. 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController]; 
    self.navController = navigationController; 
    [navigationController release]; 

    // Configure and display the window. 
    [window addSubview:navController.view]; 
    [window makeKeyAndVisible]; 
} 

Dann, wenn Sie für eine neue Ansicht bereit sind, drücken Sie eine gerade dort.

// Wherever you need to get your new view on there 
UIViewController *secondViewController = [[UIViewController alloc] init]; 
[[self navigationController] pushViewController:secondViewController animated:YES]; 
[secondViewController release]; 

Sie sollen sich wirklich um etwa 5 Apple-Beispielprojekte einen Tag, um in der iPhone-Welt zu gehen, wirklich fließend. Überprüfen Sie diese für Anfänger: TableSearch.

+0

Cheers, aber das ist nicht das, was ich bin nach. Ich habe bereits einen View-Controller und er zeigt bereits meine Ansicht an - ich möchte keinen neuen View-Controller auf den Stack schieben. Ich möchte diesen View-Controller verwenden, um eine Teilansicht zu ersetzen, die in meiner Ansicht eingebettet ist. –

0

Das wahrscheinlichste Problem ist, dass Sie den Rahmen nicht auf Ihren Ansichten festlegen, was bedeutet, dass sie, während sie erfolgreich angefügt werden, 0x0 groß sind.

Versuchen Sie so etwas wie:

- (void)loadView { 
    NSLog(@"loadView invoked"); 
    [super loadView]; 

    CGRect labelFrame = CGRectZero; 
    labelFrame.size.height = switchableView.size.height; 
    labelFrame.size.width = switchableView.size.width; 

    UILabel *label = [[UILabel alloc] initWithFrame:labelFrame]; 
    label.text = @"Segment1"; 
    [switchableView addSubview:label]; //this is what I can't work out 
    [label release];  
} 

auch entfernt Ansicht, weil es überflüssig war (ein UILabel ist ein UIView, Sie waren drei Ansicht Stapeln, von denen 2 nichts anderes als eine einzige subview haben, die seinen vollen Rahmen abdeckt.) und es hat die UIViewController-View-Eigenschaft (im Allgemeinen ist es schlecht, lokale Variablen mit dem gleichen Namen wie Instanzvariablen oder Eigenschaften zu machen, gibt es Compiler-Warnungen, die Sie aktivieren können, um dies zu vermeiden).

0

Wenn ich Ihre Frage richtig verstehe, versuchen Sie eine Ansicht mit einer anderen zu tauschen.Eine Möglichkeit, dies zu erreichen, ist wie folgt:

Fügen Sie der Stammansicht namens switchView eine UIView hinzu. Entweder im Code oder im Interface Builder erstellen Sie eine neue UIView namens subView1 und es als eine Unterklasse von Switch hinzufügen, wenn die Stammansicht Lasten:

[switchView addSubview:subView1];

Wenn der Benutzer der segmentierte Kontrolle in der Stammansicht wechselt, eine neue UIView erstellen in ähnlicher Weise benannt subView2 und schalten Sie ihn mit dem aktuellen subview von Switch:

[subView1 removeFromSuperview]; 
[switchView addSubview:subView2];
Verwandte Themen