[Objective C] navigatie tussen 'views'

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De laatste 2 dagen heb ik al uren gezocht en geprobeerd hoe je kunt navigeren tussen views uit 'xib'-files.

Ik maak een applicatie die meerdere views nodig heeft. Alles moet werken met eigen toegevoegde knoppen in ieder view. Dus geen navigation bars/navigation based application. Ik heb ieder 'view' apart in een xib-file gestoken en gelinkt aan een eigen cacoa touch subclass.

Ik ben begonnen met een view-based application. Die toont dus het eerste view in het window. Het is een soort van keuze scherm, met meerdere knoppen, iedere knop gaat naar een ander view. Nu wil ik als er op een van de knoppen geduwd wordt, een ander view wordt geladen/weergegeven. Dit is weer een keuzescherm met verschillende knoppen, dus als men weer op een van de knopen duwt gaan men weer door naar een ander scherm enzovoort. Ieder scherm moet terug kunnen gaan naar het vorige scherm en/of naar het beginscherm.

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Je kan gewoon de window.view vervangen door een andere view. Voor de rest zul je het toch zelf moeten doen als je geen navigationController wil gebruiken. Waar gaat het mis?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik geen navigationcontroller omdat ik het volledige scherm nodig heb, en die navigationbar eigenlijk stoort. In mijn view design van deze applicatie is het mooier om met knoppen in het midden van het scherm te navigeren vindt ik.

Het probleem is dat het niet lukt om van view/viewcontroller te veranderen. Ik heb nergens gevonden hoe dat je dat precies moet doen. De instructies die ik op internet gevonden heb, behandelen niet echt de situatie die ik heb. Als ik het probeer toe te passen, ontstaan er errors of loopt de applicatie vast.
--> Die window.view is toch niet toegankelijk in de viewcontroller.m class en in de andere views.m classes?

[ Voor 17% gewijzigd door Verwijderd op 30-08-2010 17:42 ]


Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Je maakt een RootViewController die vervolgens geneste viewcontrollers heeft. Dus bijvoorbeeld zo (pseudocode):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
@implementation RootViewController

- (void)viewDidLoad {
  myFirstViewController.delegate = self;
  [self.view addSubview:myFirstViewController.view];
}

- (void)myFirstViewControllerDelegateClickedButtonA {
  [myFirstViewController.view removeFromSuperview];
  [self.view addSubView:mySecondViewController.view];
}

@end


Ik denk dat je te moeilijk denkt. Probeer gewoon wat code te schrijven en je zult zien dat het werkt. Je kan ook nog eens naar Apple's View Controller Programming Guide kijken.

Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Volgens mij kan je je doel bereiken door gebruik te maken van de presentModalViewController: methode.

Code (uit mijn hoofd):

code:
1
2
3
4
5
- (void)buttonPressed:(id)sender {
   UIViewController *newViewController = [[UIVIewController alloc] initWithNibName:@"nib.xib" bundle:nil];
   [self.navigationController presentModalViewController:newViewController animated:YES];
   [newViewController release];
}

[ Voor 192% gewijzigd door MacWolf op 31-08-2010 14:36 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
MacWolf schreef op dinsdag 31 augustus 2010 @ 14:29:
Volgens mij kan je je doel bereiken door gebruik te maken van de presentModalViewController: methode.

Code (uit mijn hoofd):

code:
1
2
3
4
5
- (void)buttonPressed:(id)sender {
   UIViewController *newViewController = [[UIVIewController alloc] initWithNibName:@"nib.xib" bundle:nil];
   [self.navigationController presentModalViewController:newViewController animated:YES];
   [newViewController release];
}
Ja, dat kan ook, maar dan zonder de navigationController. Het is vergelijkbaar met pushViewController: je creeërt een stack van viewcontrollers. Ik heb wel soms problemen als ik dit "te diep" doe, dan wordt alles heel traag en gaan sommige autorotation dingen mis.

Misschien heb je trouwens hier ook nog iets aan: AlternateViews code sample van apple.

Acties:
  • 0 Henk 'm!

  • _Erikje_
  • Registratie: Januari 2005
  • Laatst online: 14-09 15:42

_Erikje_

Tweaker in Spanje

Je kunt de navigationBar gewoon verbergen hoor, dan heb je alle ruimte voor je view.

code:
1
[self.navigationController setNavigationBarHidden:YES];


oid (ligt aan je klasse natuurlijk...)

er wordt in de guidelines nogal op gehamerd om navigationcontrollers te gebruiken. Is beter voor de Look-and-feel van de applicatie

[ Voor 24% gewijzigd door _Erikje_ op 31-08-2010 21:32 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
chris schreef op maandag 30 augustus 2010 @ 21:18:
Je maakt een RootViewController die vervolgens geneste viewcontrollers heeft. Dus bijvoorbeeld zo (pseudocode):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
@implementation RootViewController

- (void)viewDidLoad {
  myFirstViewController.delegate = self;
  [self.view addSubview:myFirstViewController.view];
}

- (void)myFirstViewControllerDelegateClickedButtonA {
  [myFirstViewController.view removeFromSuperview];
  [self.view addSubView:mySecondViewController.view];
}

@end


Ik denk dat je te moeilijk denkt. Probeer gewoon wat code te schrijven en je zult zien dat het werkt. Je kan ook nog eens naar Apple's View Controller Programming Guide kijken.
Als ik dit probeer toe te passen krijg ik de volgende error: Request for member 'delegate' in something not a structure or union.

Hier de code van mijn RootViewController: 'HomeView.h'
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import <UIKit/UIKit.h>

@class ButtonOneView;

@interface HomeView : UIViewController {
    ButtonOneView *buttonOneView;

}

@property (nonatomic, retain) IBOutlet ButtonOneView *buttonOneView;

- (IBAction)btnOne_TouchUpInside:(id)sender;

@end


Hier de code van mijn 'HomeView.m'
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "HomeView.h"
#import "ButtonOneView.h"

@implementation HomeView

@synthesize buttonOneView;

- (IBAction)btnOne_TouchUpInside:(id)sender {
    buttonOneView.delegate = self;
    [self.view addSubview:buttonOneView.view];
}
- (void)dealloc {
    [buttonOneView release];
    [super dealloc];
}


Doe ik hier nu iets verkeerd of zie ik iets over het hoofd?

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Ja, je doet het fout. Ik zou een rootViewController maken met een lege view. Die delegate was een voorbeeld, die property moet je zelf maken (en het protocol met callbacks ook).

Ik heb het idee dat je nog niet zo veel ervaring hebt, ik denk dat je het beste toch een boek kan gaan lezen of wat tutorials doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met 2 boeken te lezen. Maar dit stond in geen enkel van de twee. Ik dacht dat het iets makkelijks moest zijn om te switchen van views. (zoals het switchen van windows/forms in .NET: show() en hide()). De rest van de applicatie is al goed gevorderd, maar dit is een van de enige dingen die ik nog moet doen... . En ik vind nergens hoe je dit moet doen. Bestaat er dan niets eenvoudigs om te switchen tussen mijn views in de xib-files? Het maken van de views is niet zo moeilijk, maar het weergeven blijkbaar wel?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb dus de RootViewController toegevoegd en ik ben er in geslaagd om 'HomeView' te laten weergeven.


code:
1
2
3
4
5
6
7
8
- (void)viewDidLoad {
    HomeView *home = [[HomeView alloc] initWithNibName:@"HomeView" bundle:nil];
    self.homeView = home;
    [self.view insertSubview:homeView.view atIndex:0];
    
    [home release]; 
    [super viewDidLoad];
}


Nu probeer ik op dezelfde manier 'ButtonOneView' weer te laten geven maar dit lukt niet. Laat ik [self.view removeFromSuperview] staan, dan krijg ik een leeg scherm. Doe ik dit weg, dan verschijnt 'ButtonOneView' bovenop het 'HomeView' en zijn alletwee de lagen zichtbaar.


code:
1
2
3
4
5
6
7
8
- (IBAction)btnOne_TouchUpInside:(id)sender {        
        ButtonOneView *buttonOne = [[ButtonOneView alloc] initWithNibName:@"ButtonOneView" bundle:nil];
    self.buttonOneView = buttonOne;
    [self.view removeFromSuperview];
    [self.view insertSubview:buttonOneView.view atIndex:1];
    
    [buttonOne release];
}

Acties:
  • 0 Henk 'm!

  • MacWolf
  • Registratie: Januari 2004
  • Laatst online: 06-09-2024
Misschien heb ik de oplossing voor je probleem. Ik heb een project gemaakt met 2 views die gewisseld kunnen worden. Ik heb wel alles in code gedaan, gezien ik op die manier het meest effectief ben. Het project is hier te downloaden:

http://www.mediafire.com/?0l9c95n7h0gp529

Edit - enige uitleg:
- Ik maak gebruik van 1 basisview (BaseView). In deze BaseView wordt een referentie bewaard naar de ViewController die de view weergeeft.
- Er zijn 2 views die een subklasse zijn van BaseView, deze zijn genaamd FirstView en SecondView. Beide hebben een andere achtergrondkleur. Beide hebben een button waarmee een methode aangeroepen wordt in de ViewController genaamd switchView:.
- In de switchView: methode wordt tijdelijk de retainCount verhoogd van de viewController. Dit doe ik omdat een viewController automatisch wordt ge-released als hij geen views meer heeft. Zou ik de retainCount niet verhogen, dan zou er een crash optreden op het moment dat de views gewisseld worden.

[ Voor 86% gewijzigd door MacWolf op 06-09-2010 10:17 ]

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition.


Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Verwijderd schreef op zondag 05 september 2010 @ 16:25:
[...]
Nu probeer ik op dezelfde manier 'ButtonOneView' weer te laten geven maar dit lukt niet. Laat ik [self.view removeFromSuperview] staan, dan krijg ik een leeg scherm. Doe ik dit weg, dan verschijnt 'ButtonOneView' bovenop het 'HomeView' en zijn alletwee de lagen zichtbaar.


code:
1
2
3
4
5
6
7
8
- (IBAction)btnOne_TouchUpInside:(id)sender {        
        ButtonOneView *buttonOne = [[ButtonOneView alloc] initWithNibName:@"ButtonOneView" bundle:nil];
    self.buttonOneView = buttonOne;
    [self.view removeFromSuperview];
    [self.view insertSubview:buttonOneView.view atIndex:1];
    
    [buttonOne release];
}
Volgens mij moet het zijn:
code:
1
[self.homeView.view removeFromSuperview]


Nu verwijder je namelijk de container, niet de content view.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@MacWolf: thanks, ik zal dat zeker eens bekijken.
@Chris: Nu krijg ik de volgende error: Request for member 'homeView' in something not a structure or union.

edit: @chris: Als ik in HomeView.h de @class HomeView toevoeg en dan juist hetzelfde doe zoals in de RootViewController om homeView te kunnen gebruiken is de error weg. Maar dan is het juist hetzelfde effect alsof die [self.view removeFromSuperview]; er niet stond: met andere woorden, de 2 views zijn zichtbaar (knoppen, labels, enzovoort, ze overlappen elkaar dus gedeeltelijk)

[ Voor 55% gewijzigd door Verwijderd op 07-09-2010 13:09 ]

Pagina: 1