通过DismissViewController将动作传递给视图

时间:2013-03-27 00:31:32

标签: ios uiviewcontroller ibaction

的ViewController

  • UIWebView:webView - 简单的UIWebView
  • UIButton:aboutButton - 带您进入AboutViewController

AboutViewController

  • UIButton:websiteButton - 已连接到clickWebsiteButton
  • IBAction:clickWebsiteButton - 关闭AboutViewController,在http://websiteURL.com/中加载webView(在ViewController中)

AboutViewController代码

// AboutViewController.h

#import "ViewController.h"

@class ViewController;

@interface AboutViewController : UITableViewController <UIWebViewDelegate> {
    ViewController *viewController;
}


// AboutViewController.m

-(IBAction)clickWebsiteButton:(id)sender {
    [viewController.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://websiteURL.com/"]]];
    [self dismissModalViewControllerAnimated:YES];
}

问题

我希望能够在通过IBAction解除视图时在UIWebView中加载http://websiteURL.com/。截至目前,它只是关闭视图但不在WebView中加载URL。 WebView正在正常工作并正确加载URL,我只是在从不同的视图加载此URL时遇到麻烦。有什么想法吗?

由于

3 个答案:

答案 0 :(得分:1)

我回答your other question有关持久数据存储的问题。这是让viewControllers分享数据的另一种方式,所以你可能不再需要这个,但以防万一......

问题是,在解除显示的viewController(aboutViewController)之前,您正在调用viewController上的方法。需要在解雇过程完成后调用它。

此方法:

dismissModalViewControllerAnimated:

在iOS6中已弃用,因为iOS5鼓励您使用此代替

dismissViewControllerAnimated:completion:

其中completion采用块参数。放置在完成块中的代码将在解雇完成后执行。您可以在此处向呈现的viewController发送消息。

self.presentingViewController是对viewController的引用,它提供了aboutViewController - 它由iOS提供,作为呈现过程的一部分。但是你不能在完成块中使用它,因为它在解雇过程中被取消,所以你需要先将它复制到局部变量。

在aboutViewController中......

-(IBAction)clickWebsiteButton:(id)sender 
{
        //to use self.presentingViewController in the completion block
        //you must first copy it to a local variable 
        //as it is cleared by the dismissing process 

    UIViewController* presentingVC = self.presentingViewController;

    [self.presentingViewController dismissViewControllerAnimated:YES
                                     completion:
     ^{
         if ([presentingVC respondsToSelector:@selector(loadRequestWithString:)]) {
             [presentingVC performSelector:@selector(loadRequestWithString:) 
                                withObject:@"http://websiteURL.com/"];
         }
     }];
}

在你的呈现viewController中,创建一个接受字符串参数的方法:

- (void) loadRequestWithString:(NSString*)webString
{
    NSURL* requestURL = [NSURL URLWithString:webString];
    [self.webView loadRequest:[NSURLRequest requestWithURL:requestURL]];


}

答案 1 :(得分:0)

一种选择是使用委托回调。使用当前代码,viewController即时为零。我有一个示例如何实现委托模式here

答案 2 :(得分:-1)

请记住,如果您使用的是UINavigationController,则必须执行

UINavigationController *viewConNav = (UINavigationController *)self.presentingViewController;
YourVC *viewCon = (YourVC *)viewConNav.topViewController;