我有两个视图控制器:TableViewController(用作模态视图控制器)和ToolbarController。在Interface Builder中,我有ToolbarView,它由ToolbarController控制。
ToolbarView有一个工具栏控制器控制的IBOutlet UIWebView(使用工具栏上的按钮切换webview中的页面)。
我需要的是能够让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
答案 0 :(得分:2)
我建议使用委托来处理这项任务。设置将由工具栏视图控制器实现的委托协议,例如URLSelectionDelegate
。您可能只需要一种方法,例如-urlSelectionDelegateDidSelectItemWithURL:(NSString *)selectedItemURL
或类似方法。这样,您的模态表视图控制器仅在选择项时负责其父项,并且您将所有与UIWebView
相关的逻辑保存在工具栏视图控制器中的相同位置。
您可以在自己的文件中声明委托协议,或者只是在工具栏视图控制器的标题中声明:
@protocol URLSelectionDelegate <NSObject>
- (void)urlSelectionDelegateDidSelectItemWithURL:(NSString *)selectedItemURL;
@end
然后,您的Web视图控制器将实现此URLSelectionDelegate
协议,这意味着它实现了urlSelectionDelegateDidSelectItemWithURL:
方法:
@interface TableViewController : UITableViewController <URLSelectionDelegate>
// ...
@end
现在,您将向名为“delegate”或“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?"中阅读有关不同选项的更多信息,并且可以在delegation pattern
中了解有关Objective-C中How do I create delegates in Objective-C?的更多信息答案 1 :(得分:0)
webView是否初始化为ToolbarView中的那个?通常我会通过在TableViewController上添加我自己的init方法来实现,该方法传递对该对象的引用。