2009-12-15 6 views
0

J'ai deux contrôleurs View: TableViewController (qui est utilisé comme un contrôleur de vue modale) et ToolbarController. Dans Interface Builder, j'ai ToolbarView, qui est contrôlé par le ToolbarController.iPhone ViewController affectant IBOutlet d'un autre ViewController

ToolbarView possède un contrôle IBOutlet UIWebView que les contrôles ToolbarController (utilise les boutons d'une barre d'outils pour basculer les pages dans un affichage Web).

Ce dont j'ai besoin, c'est que TableViewController puisse modifier l'UIWebview dans ToolbarView.

Comment puis-je accomplir ceci?

TableViewController.h:

#import <UIKit/UIKit.h> 
#import "ToolbarController.h" 
#import "MyAppDelegate.h" 


@interface TableViewController : UITableViewController { 
    NSMutableArray *widgetList; 
    IBOutlet UIWebView *webView; 
} 

@property(nonatomic,retain) IBOutlet UIWebView *webView; 

@end 

TableViewController.m:

#import "TableViewController.h" 
    #import "MyAppDelegate.h" 
    #import "ToolbarController.h" 
    #import "TableView.h" 

    @implementation TableViewController 

    @synthesize webView; 

    //Lots of working code omitted 
//didSelectRowAtIndex below should change the webView in ToolbarView to Google's homepage but does not. 

     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
      NSString *urlAddress=[NSString stringWithFormat:@"http://www.google.com"]; 
      NSURL *url = [NSURL URLWithString:urlAddress]; 
      NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
      [webView loadRequest:requestObj]; 
      [self dismissModalViewControllerAnimated:YES]; 
     } 

     - (void)viewDidUnload { 
      // Release any retained subviews of the main view. 
      // e.g. self.myOutlet = nil; 
     } 


     - (void)dealloc { 
      [super dealloc]; 
     } 


     @end 

Répondre

2

Je suggère d'utiliser la délégation pour gérer cette tâche. Configurez un protocole délégué tel que URLSelectionDelegate qui sera implémenté par votre contrôleur de vue de la barre d'outils. Vous auriez probablement juste besoin d'une méthode, telle que -urlSelectionDelegateDidSelectItemWithURL:(NSString *)selectedItemURL ou similaire. De cette façon, votre contrôleur de vue de table modale n'est responsable que de son parent quand un élément a été sélectionné, et vous gardez toute votre logique liée au UIWebView au même endroit, dans le contrôleur de vue de la barre d'outils.

Vous devrez déclarer le protocole délégué dans son propre fichier, ou tout simplement dans l'en-tête du contrôleur de votre vue barre d'outils, comme tel:

@protocol URLSelectionDelegate <NSObject> 
- (void)urlSelectionDelegateDidSelectItemWithURL:(NSString *)selectedItemURL; 
@end 

Votre contrôleur d'affichage Web serait alors mettre en œuvre ce protocole URLSelectionDelegate, ce qui signifie qu'elle met en œuvre la urlSelectionDelegateDidSelectItemWithURL: méthode:

@interface TableViewController : UITableViewController <URLSelectionDelegate> 
// ... 
@end 

vous allez maintenant ajouter une propriété à votre contrôleur de vue modal table nommée "délégué" ou "urlSelectionDelegate":

@property (nonatomic, assign) id<URLSelectionDelegate> delegate; 

et définir que le contrôleur de vue parent quand il est initialisé:

// Initialize table view controller (keep your existing code) 
TableViewController *vc = [[TableViewController alloc] init]; 
// Assign the delegate 
[vc setDelegate:self]; 

Maintenant, dans votre méthode didSelectRowWithIndexPath, vous appelez la méthode des délégués en conséquence:

if ([self delegate] != nil && [[self delegate] respondsToSelector:@selector(urlSelectionDelegateDidSelectItemWithURL:)) { 
    [delegate urlSelectionDelegateDidSelectItemWithURL:@"http://www.google.com/"; 
} 

Ensuite, il suffit de mettre la logique pour modifier la vue Web dans le contrôleur de vue parent.

Vous pouvez lire beaucoup plus sur vos différentes options "What’s the best way to communicate between view controllers?" et vous pouvez en apprendre davantage sur le delegation pattern en Objective-C dans How do I create delegates in Objective-C?

+0

Est-ce que ce délégué serait une sous-classe de TableViewController? – LoganFrederick

+0

Un délégué est en fait un protocole, qui est très similaire à une interface dans d'autres langages OO. C'est quelque chose qu'une classe donnée implémente, mais les sous-classes ne sont pas impliquées. J'ai juste ajouté beaucoup de code qui montrera utilement comment vous pourriez utiliser des délégués dans ce scénario. Vous apprendrez beaucoup plus si vous cliquez sur les liens que j'ai fournis.:) – pix0r

+0

pix0r, vous êtes mon héros. Merci! – LoganFrederick

0

est webView initialisé à celui ToolbarView? Typiquement, je le ferais en ajoutant ma propre méthode init sur TableViewController qui transmet une référence à cet objet.

Questions connexes