ModalViewController informatie doorgeven, argh!?!

ModalViewController informatie doorgeven, argh!?! discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) Ik heb een iPad app met een ModalViewController, om precies te zijn een UIModalPresentationFormSheet, hierin staat een UITableView. Als ik een rij selecteer (didSelectRowAtIndexPath) dan ...



Ga terug   iPhone, iPod touch, iPad en Apple TV forum > Development > Ontwikkelen voor iOS
Wachtwoord vergeten? Registreren!
Registreer FAQ Ledenlijst Kalender Zoeken Berichten van vandaag Markeer forums als gelezen
  #1  
Oud 20 April 2011, 17:28
» iPhone 4 32GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 16 February 2009
Berichten: 37
Standaard ModalViewController informatie doorgeven, argh!?!

Ik heb een iPad app met een ModalViewController, om precies te zijn een UIModalPresentationFormSheet, hierin staat een UITableView. Als ik een rij selecteer (didSelectRowAtIndexPath) dan stuurt hij de info naar de view erachter (omdat het een FormSheet is). Die info krijg ik binnen via een method:
De PopOverView.m met de tabel erin:
Code:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

	SecondViewController *viewController = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease];
	[viewController doTab:indexPath];
	NSLog(@"Selected Tab: %i", [indexPath row]);
	[self dismissModalViewControllerAnimated:YES];
}
Dit werkt prima, de NSLog krijgt hem binnen e.d. en ook de method doTab krijgt hem binnen:

Code:
- (void)doTab:(NSIndexPath *)index
{
	NSLog(@"INDEX: %i", [index row]);
	tabTitle.text = @"Selected Tab: %i", [index row];
}
De NSLog krijg ik hem wel te zien, namelijk 1, 0, 2 ga zo door. Maar de label met de IBOutlet tabTitle veranderd niet. In interface builder zit ook alles goed, want ik kan de text wel in de viewDidLoad e.d. veranderen, maar niet in de doTab method, waarom!?!?!

Heeft er iemand een idee waarom?
Advertentie
Advertentie Gesponsorde links (verdwijnt na registratie)

  #2  
Oud 20 April 2011, 23:42
» iPhone 4 32GB (Zwart) [FW: 5.0]  [Jailbreak: Nee]
» iPad 3 Wi-Fi 16GB (Zwart) [FW: 5.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 14 October 2008
Locatie: Haarlem
Berichten: 348
Standaard Probeer dit eens

Niet zo (dat geeft geen compilerfout??):
Code:
- (void)doTab:(NSIndexPath *)index
{
    NSLog(@"INDEX: %i", [index row]);
    tabTitle.text = @"Selected Tab: %i", [index row];
}
Maar zo:
Code:
- (void)doTab:(NSIndexPath *)index
{
    NSLog(@"INDEX: %i", [index row]);
    tabTitle.text = [NSString stringWithFormat:@"Selected Tab: %d", [index row]];
}
__________________
Leon
[iPhone- en Java ontwikkelaar]

Laatst gewijzigd door wubbe; 21 April 2011 om 08:23.
  #3  
Oud 21 April 2011, 12:23
» iPhone 4 32GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 16 February 2009
Berichten: 37
Standaard

Dat geeft geen verschil, okal zou ik gewoon een NSString neerzetten zonder die index row erbij veranderd hij niet. Het lijkt wel alsof mijn method de IBOutlet niet mag updaten ofzo?

Kan het zijn dat de view nog niet helemaal afgeladen is als de method al geroepen wordt? De method wordt namelijk aangeroepen in PopOverView.m waarna deze weer verborgen wordt.
  #4  
Oud 21 April 2011, 14:13
Geno's schermafbeelding
» iPhone 6 128GB (Goud) [FW: 9.0 beta]  [Jailbreak: Nee]
» iPad Air Wi-Fi 32GB (Zilver) [FW: 8.4]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 4 November 2009
Berichten: 251
Send a message via twitter to Geno
Standaard

Geef je t label tekst wel door aan de andere view? Hoe ziet je header file eruit?
  #5  
Oud 21 April 2011, 14:18
» iPhone 4 32GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 16 February 2009
Berichten: 37
Standaard

Ik krijg de tekst door, want die wordt wel weergeven in de NSLog. Het probleem is dat de Label gewoon niet update, als ik hem aanroep vanuit viewDidLoad dan wel, maar gewoon niet vanuit mijn method, okal zou ik elke keer als er een rij geselecteerd worden de label veranderen naar tabTitle.text = @"HALLO";
dan doet hij dat nog steeds niet..
  #6  
Oud 21 April 2011, 15:14
Geno's schermafbeelding
» iPhone 6 128GB (Goud) [FW: 9.0 beta]  [Jailbreak: Nee]
» iPad Air Wi-Fi 32GB (Zilver) [FW: 8.4]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 4 November 2009
Berichten: 251
Send a message via twitter to Geno
Standaard

En wat als je viewController.tabTitle.text doet? (wel even viewController declareren)

Edit: zit nu achter mn Mac en niet iPhone: Wellicht delegate gebruiken.

Laatst gewijzigd door Geno; 21 April 2011 om 19:13.
  #7  
Oud 21 April 2011, 21:19
» iPhone 4 32GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 16 February 2009
Berichten: 37
Standaard

Welke delegate gebruiken? ik begrijp het niet helemaal.
  #8  
Oud 21 April 2011, 22:12
Geno's schermafbeelding
» iPhone 6 128GB (Goud) [FW: 9.0 beta]  [Jailbreak: Nee]
» iPad Air Wi-Fi 32GB (Zilver) [FW: 8.4]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 4 November 2009
Berichten: 251
Send a message via twitter to Geno
Standaard

De juiste manier om data door te geven met een UIModalViewController is via een delegate. Je moet bij de modal view aangeven dat het zich houdt aan de delegate protocol. De delegate van je modal view wijs je toe aan de SecondViewController (dat is neem ik aan de view achter je form sheet).

Dit is een stukje uit de documentatie van Apple:

In iOS, there are a number of standard system view controllers that are designed to be presented modally by your application. The basic rules for presenting these view controllers are the same as for your custom view controllers. However, because your application does not have access to the view hierarchy managed by the system view controllers, you cannot simply implement actions for the controls in the views. Interactions with the system view controllers typically take place through a delegate object.

Each system view controller defines a corresponding protocol, whose methods you implement in your delegate object. Each delegate usually implements a method to accept whatever item was selected or cancel the operation. Your delegate object should always be ready to handle both cases. One of the most important things the delegate must do is dismiss the presented view controller by calling the dismissModalViewControllerAnimated: method of the view controller that did the presenting—in other words, the parent of the modal view controller.


Dit is bv de delegate method die je kan toepassen:

Code:
- (void)popOverView: (PopOverView *)popOverView doTab: (NSIndexPath *)index;
Omdat je nu de delegate hebt toegewezen aan SecondViewController, 'dismiss' je daar ook je modal view, in je eigen delegate method via self.

Laatst gewijzigd door Geno; 21 April 2011 om 23:36.
  #9  
Oud 21 April 2011, 23:02
» iPhone 4 32GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 16 February 2009
Berichten: 37
Standaard

Deze delegate zet ik dan in secondviewcontroller.h en roep ik aan in PopOverView.m in de didselectrowatindex?
  #10  
Oud 21 April 2011, 23:34
Geno's schermafbeelding
» iPhone 6 128GB (Goud) [FW: 9.0 beta]  [Jailbreak: Nee]
» iPad Air Wi-Fi 32GB (Zilver) [FW: 8.4]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 4 November 2009
Berichten: 251
Send a message via twitter to Geno
Standaard

Nee in de PopOverView.h. Je declareert de delegate protocol in de header file van je modal view, inclusief delegate object:
Code:
id <PopOverViewDelegate> delegate;
Daarna wijs je de delegate toe in je in secondviewcontroller. Bv. zo:

Code:
popOverView.delegate = self;
Daarna roep je idd die method aan in je PopOverView.m

Code:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.delegate popOverView:self doTab:[indexPath row];
}
Er stond een fout in mn vorige post. Beter is om de method zo te schrijven:

Code:
- (void)popOverView: (PopOverView *)popOverView doTab: (NSIndexPath *)index;
Voor de duidelijkheid dit is wat je moet declareren in je PopOverView.h

Code:
@protocol PopOverViewDelegate;

@interface PopOverView : UIViewController
{
id <PopOverViewDelegate> delegate;
}
@property (assign) id <PopOverViewDelegate> delegate;

@protocol PopOverView <NSObject>
- (void)popOverView: (PopOverView *)popOverView doTab: (NSIndexPath *)index;

@end

Laatst gewijzigd door Geno; 21 April 2011 om 23:41.
  #11  
Oud 21 April 2011, 23:35
» iPhone 4 32GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» iPad 2 Wi-Fi 16GB (Zwart) [FW: 5.0.1]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 16 February 2009
Berichten: 37
Standaard

YES! Top het werkt! ik zat idd fout met de delegates, ik ben nog een beginner, maar dat is wel even wennen!
  #12  
Oud 21 April 2011, 23:43
Geno's schermafbeelding
» iPhone 6 128GB (Goud) [FW: 9.0 beta]  [Jailbreak: Nee]
» iPad Air Wi-Fi 32GB (Zilver) [FW: 8.4]  [Jailbreak: Nee]
» Mac OS X
 
Geregistreerd: 4 November 2009
Berichten: 251
Send a message via twitter to Geno
Standaard

Ah top!

Ja die delegates kunnen wat lastig zijn. Je moet het zien als een soort notificatie systeem.

In principe is dit niet altijd nodig bij een modalview, maar dus wel als je data doorgeeft naar een andere view.
Reageren

Labels
ipad, modalviewcontroller, view


Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten)

 
Discussietools
Weergave

Soortgelijke discussies

Discussie Auteur Forum Reacties Laatste bericht
ipad doorgeven met zelfde account peterpijpelink iPad algemeen 3 28 March 2011 14:48
App, Ontvangst T-mobile klachten doorgeven RSH T-Mobile 0 16 June 2010 14:46
modalViewController voor twee seconden weergeven libia Ontwikkelen voor iOS 4 9 June 2009 23:47

Regels voor berichten
Je mag geen nieuwe discussies starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit
Trackbacks are Aan
Pingbacks are Aan
Refbacks are Uit



Alle tijden zijn GMT +2. Het is nu 01:11.