在另一个类的webView上加载NSURLRequest。

时间:2015-07-13 23:09:16

标签: ios webview properties uiwebview synthesize

我在故事板中创建了一个名为GoogleSearchController的视图控制器。当然,webView的属性是在GoogleSearchController中声明的。

我正在尝试在MapViewController中访问合成的webView属性,即* googleWebView,以便我可以将我的点注释附加到谷歌搜索。这里的输出是正确的。我收到了附加的和想要的URL,但我没有真正加载它。在leftButtonAnnotationPressed方法的末尾,您会注意到我尝试在self.classObj.googleWebView上调用loadRequest。有些事情不应该如此。这是我第一次尝试使用@synthesize,我对所有建议持开放态度。

我的问题分为两部分。 A:我是否正在使用@synthesize?和B:如果这是正确的用法,为什么我的webView不会加载请求?

GoogleSearchController.h

 @interface GoogleSearchController : UIViewController <UIWebViewDelegate>

 @property (strong, nonatomic) IBOutlet UIWebView *googleWebView;

 @end

GoogleSearchController.m

@synthesize googleWebView;

- (void)viewDidLoad {
    [super viewDidLoad];

    self.googleWebView = [[UIWebView alloc] init];
    self.googleWebView.delegate = self;
}

MapViewController.m

@property (nonatomic, strong) GoogleSearchController *classObj;

-(void)leftButtonAnnotationPressed:(UIButton *)sender {
[self performSegueWithIdentifier:@"googleSearch" sender:nil];
self.classObj = [[GoogleSearchController alloc] init]; <--------

MKPointAnnotation *annotation = [self.mapView.selectedAnnotations objectAtIndex:([self.mapView.selectedAnnotations count]) -1];
NSString *appendString = annotation.title;
NSString *googleString = @"http://www.google.com/search?q=";
NSString *appendedUrlString = [googleString stringByAppendingString:appendString];

if ([appendedUrlString containsString:@" "]) {
    appendedUrlString = [appendedUrlString stringByReplacingOccurrencesOfString:@" " withString:@"+"];

    NSURL *url = [NSURL URLWithString:appendedUrlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.classObj.googleWebView loadRequest:request];<------

    NSLog(@"appended string: %@", request);

}

2 个答案:

答案 0 :(得分:1)

@sythesize不再是必需/强制性的。没有@synthesize iOS / XCode会自动为您创建一个实例变量_ [propertyName]

如果您的UIWebView是在IB中创建的,则无需以编程方式初始化它。确保您的webView和ViewController IBOutlet属性已连接。这应该足够了。

我可以认为您的请求未加载的重要原因是因为您在与GoogleSearchViewController

中显示的实例不同的实例中加载了网址

你这样做

[self performSegueWithIdentifier:@"googleSearch" sender:nil];
self.classObj = [[GoogleSearchController alloc] init]; <--------

在第一行中,您要求故事板执行segue。因此,故事板将创建视图控制器的实例,其中包含视图和所有子视图并显示。

在第二行中,您正在创建自己的视图控制器实例。谁在显示它? - 没有人。

您在错误的实例中加载网址。

现在好了,我如何获得对正在显示的视图控制器的访问权限?

Xcode / iOS为您提供了使用prepareForSegue执行此操作的选项,您可以访问VC和webview,如下所示加载请求。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"googleSearch"]){
        GoogleSearchViewController *vc = nil;
        if([segue.destinationViewController isKindOfClass:[UINavigationController class]]){
            UINavigationController *navVC = (UINavigationController *)segue.destinationViewController;
            vc = (GoogleSearchViewController *)navVC.viewControllers[0];
        }else{
            vc = segue.destinationViewController;
        }
        if(vc){
            NSURL *url = [NSURL URLWithString:appendedUrlString];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
            [vc.googleWebView loadRequest:request];

        }
    }

}

有兴趣知道这是否适合您

答案 1 :(得分:0)

将NSURLRequest存储在数据源中似乎是一个相当简单的解决方案。在DataSource.h中,我们所做的就是声明NSURLRequest * searchURL类型的公共属性。

+(instancetype) sharedInstance;

@property (nonatomic, strong) NSURLRequest *searchURL;

sharedInstance将用于我们的单例模式,这确保我们只获取DataSource的一个实例。在DataSource.m中,我们将实现我们的sharedInstance :(对于post部分是教科书)。

+ (instancetype) sharedInstance {
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

这就是我们存储NSURLRequest的全部内容。

在MapViewController中,我们使用sharedInstance从DataSource中访问NSURLRequest属性,并将其设置为等于附加的NSURLRequest。

- (void) leftAnnotationButtonPressed:(UIButton *)sender {

        MKPointAnnotation *annotation = [self.mapView.selectedAnnotations objectAtIndex:([self.mapView.selectedAnnotations count]) -1];
        NSString *appendString = annotation.title;
        NSString *googleString = @"http://www.google.com/search?q=";
        NSString *appendedUrlString = [googleString stringByAppendingString:appendString];

        if ([appendedUrlString containsString:@" "]) {
            appendedUrlString = [appendedUrlString stringByReplacingOccurrencesOfString:@" " withString:@"+"];

            NSURL *url = [NSURL URLWithString:appendedUrlString];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
            [DataSource sharedInstance].searchURL = request;  <----
            NSLog(@"appended string: %@", request);
        }

        [self performSegueWithIdentifier:@"googleSearch" sender:nil];
}

剩下的就是加载webView。这可以在视图中完成加载此属性所在的GoogleSearchController。 (这消除了所有的头痛)。

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.googleWebView loadRequest:[DataSource sharedInstance].searchURL];
}

我们在这里所做的只是在我们的webView上使用现在存储在DataSource中的NSURLRequest调用loadRequest。我们完成了。我喜欢这种方法,我希望其他任何人都能阅读这篇文章。您甚至可以获得关于单身人士和数据源的一些经验教训。