2009-12-15 118 views
0

我有两个视图控制器:TableViewController(用作模式视图控制器)和ToolbarController。在界面生成器中,我有ToolbarView,它由ToolbarController控制。iPhone ViewController影响另一个ViewController的IBOutlet

ToolbarView具有一个IBOutlet的UIWebView该ToolbarController对照(使用工具栏上的按钮切换页面在网页视图)。

我需要的是能够让TableViewController更改ToolbarView中的UIWebview。

我该如何做到这一点?

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 

回答

2

我会建议使用代表团来处理这个任务。设置一个委托协议,例如URLSelectionDelegate将由您的工具栏视图控制器实现。您可能只需要一种方法,如-urlSelectionDelegateDidSelectItemWithURL:(NSString *)selectedItemURL或类似方法。这样,当您选择某个项目时,您的模式表格视图控制器仅对其父项负责,并且您将所有与您的UIWebView相关的逻辑保存在工具栏视图控制器中的相同位置。

您将宣布委托协议在它自己的文件,或者干脆在工具栏视图控制器的标题,因为这样的:

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

您的Web视图控制器会那么实现这个URLSelectionDelegate协议,这意味着它实现了urlSelectionDelegateDidSelectItemWithURL:方法:

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

现在,您将属性添加到名为“委托”或“urlSelectionDelegate”你的模态表视图控制器:

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

当它的初始化设置父视图控制器:现在

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

,在你didSelectRowWithIndexPath方法,你会调用委托方法相应:

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

然后,只需把在父视图控制器内部更改Web视图的逻辑。

你可以阅读了很多有关在"What’s the best way to communicate between view controllers?"您不同的选择,你可以在How do I create delegates in Objective-C?

+0

该委托是否是TableViewController的子类? – LoganFrederick 2009-12-15 19:37:42

+0

委托实际上是一种协议,与其他OO语言中的接口非常相似。这是一个给定的类实现的东西,但子类不涉及。我只是添加了很多代码,可以帮助您演示如何在这种情况下使用委托。如果您点击我提供的链接,您将学到更多。:) – pix0r 2009-12-15 20:07:35

+0

pix0r,你是我的英雄。谢谢! – LoganFrederick 2009-12-15 23:04:26

0

是webView的初始化为一个在ToolbarView详细了解delegation pattern在Objective-C?通常我会通过在TableViewController上添加我自己的init方法来实现这一点,该方法传递对该对象的引用。

相关问题