iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   ModalViewController informatie doorgeven, argh!?! (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/89580-modalviewcontroller-informatie-doorgeven-argh.html)

imosed 20-04-11 17:28

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?

wubbe 20-04-11 23:42

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


imosed 21-04-11 12:23

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.

Geno 21-04-11 14:13

Geef je t label tekst wel door aan de andere view? Hoe ziet je header file eruit?

imosed 21-04-11 14:18

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

Geno 21-04-11 15:14

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

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

imosed 21-04-11 21:19

Welke delegate gebruiken? ik begrijp het niet helemaal.

Geno 21-04-11 22:12

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.

imosed 21-04-11 23:02

Deze delegate zet ik dan in secondviewcontroller.h en roep ik aan in PopOverView.m in de didselectrowatindex?

Geno 21-04-11 23:34

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


imosed 21-04-11 23:35

YES! Top het werkt! ik zat idd fout met de delegates, ik ben nog een beginner, maar dat is wel even wennen!

Geno 21-04-11 23:43

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.


Alle tijden zijn GMT +2. Het is nu 17:39.