iPhone ViewController影响另一个ViewController的IBOutlet

时间:2009-12-15 19:13:38

标签: iphone objective-c

我有两个视图控制器: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

2 个答案:

答案 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方法来实现,该方法传递对该对象的引用。