【问题标题】:Dismissing UIWebView when returning back to UITableViewController返回 UITableViewController 时关闭 UIWebView
【发布时间】:2013-01-26 01:29:53
【问题描述】:

我有一个使用 UITableViewController 的应用程序,它调用内部带有 UIWebView 的 UIViewController。我的一切工作正常,除了当我单击表格单元格时,它会将我带到 UIViewController 并在里面打开相应的 weburl,但是当我返回 UITableViewController 时它不会关闭该网站。它抵消了网站,所以我知道我回到了 tableview 但网站仍然可见。我错过了什么?

WebViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

}

-(void)viewDidAppear:(BOOL)animated {
webView2.delegate = self;
webView2.backgroundColor = [UIColor clearColor];
NSString *urlAddress = self.magURL;
webURL = [NSURL URLWithString:urlAddress];

requestObj = [NSURLRequest requestWithURL:webURL];
[webView2 loadRequest:requestObj];
}

-(void)viewDidDisappear:(BOOL)animated
{
webView2.delegate = nil;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}

- (void)webViewDidStartLoad:(UIWebView *)webView
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
}

TableViewController.m - (void)viewDidLoad { [超级viewDidLoad];

magazineArray = [[NSMutableArray alloc] init];
[magazineArray addObject:@"Joyce Meyer"];
[magazineArray addObject:@"Perry Stone"];
[magazineArray addObject:@"Robb Thompson"];
[magazineArray addObject:@"R.W. Schambach"];
[magazineArray addObject:@"T.D. Jakes"];
[magazineArray addObject:@"Reinhard Bonnke"];
[magazineArray addObject:@"Pilot"];

self.navigationItem.title = @"Magazines";

magazineURL = [[NSMutableArray alloc] init];
[magazineURL addObject:@"http://mysolutionsmagazine.com/solutions/2013/magazine"];
[magazineURL addObject:@"http://google.com"];
[magazineURL addObject:@"http://smithmediagroup.com"];
[magazineURL addObject:@"http://smgvoices.com"];
[magazineURL addObject:@"http://facebook.com/smithmediagroup"];
[magazineURL addObject:@"http://twitter.com/smgvoices"];
[magazineURL addObject:@"http://youtube.com/smgvoices"];

MagazineURLViewController *urlController = [[MagazineURLViewController alloc] init];
urlController.urlHolder = newURLHolder;

}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath     *)indexPath
{
newURLHolder = [magazineURL objectAtIndex:indexPath.row];
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(50, 100, 690, 750)];

NSURL *webURL2 = [NSURL URLWithString:newURLHolder];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:webURL2];

[webView loadRequest:requestObj];
[self.view addSubview:webView];

}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

if ([[segue identifier] isEqualToString:@"Cell2"]){
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    newURLHolder = magazineURL[indexPath.row];
    [[segue destinationViewController]setMagURL:newURLHolder];

}
}

【问题讨论】:

    标签: ios uiviewcontroller uiwebview uitableview


    【解决方案1】:

    您正在将 webviewcontriller 的视图作为子视图添加到 tableviewcontroller 的视图中。它可能看起来没有任何问题,我认为它是苹果的严格禁止(iPad 是一个例外,因为它有你可以使用的 splitviewcontroller)。

    当您将其添加为子视图时,您的默认视图控制器方法(viewwill/didappear 等)将不会被调用。

    要么将它作为一个新的视图控制器推送,要么以模态方式呈现它,当你弹出/关闭你的 webview 控制器时,一切都会正常工作。

    如果您不想以模态方式推送或呈现,只需在 tableviewController 中使用 webview,实现 webView 的委托方法,将其添加为子视图。

    【讨论】:

      【解决方案2】:

      与其将 webview 添加为子视图,不如推送 webview:

      [self.navigationController pushViewController:webview animated:YES];
      

      当你想关闭 web 视图时:

      [self.parentViewController.navigationController popViewControllerAnimated:YES];]
      

      【讨论】:

      • 这是我收到的警告,当我运行它时它会崩溃。 “不兼容的指针类型将 'UIWebView *__strong' 发送到 'UIViewController *' 类型的参数”
      【解决方案3】:

      目前看起来您从未调用您在单元格选择时创建 UIWebView 的 webViewController 并将其添加到当前视图。所以我的问题是你有没有说过 removeFormSuperview?

      【讨论】:

        【解决方案4】:

        您似乎正在使用 Storyboard。问题似乎与

        中不必要的代码有关

        tableView:didSelectRowAtIndexPath:

        您不必将 web 视图添加到当前视图中,您需要在 @"Cell2" 视图控制器中包含该代码。

        看起来你快到了,你正在将一个 URL 传递给 prepareForSegue 中的下一个视图控制器

        您应该有另一个视图控制器来读取 magURL 属性并显示该网页。

        在表格视图控制器中更像这样:

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath     *)indexPath
        {
          newURLHolder = [magazineURL objectAtIndex:indexPath.row];
        }
        
        - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
        {
          if ([[segue identifier] isEqualToString:@"Cell2"]){
              [[segue destinationViewController] setMagURL:newURLHolder];
          }
        }
        

        然后在你的新视图控制器中

        - (void)viewDidLoad
        {
        // if webview is created in the storyboard you won't need to `init` it here. Just use [self webView]
        UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(50, 100, 690, 750)];
        
        NSURL *webURL2 = [NSURL URLWithString:[self magURL]];
        NSURLRequest *requestObj = [NSURLRequest requestWithURL:webURL2];
        
        [webView loadRequest:requestObj];
        [self.view addSubview:webView];
        }
        

        【讨论】:

        • 这修复了它,但现在 webView 正在再次加载 url 偏移量?有什么想法吗?
        • 我假设您的意思是网页显示偏移尺寸? [[UIWebView alloc] initWithFrame:CGRectMake(50, 100, 690, 750)] 是否可能需要更改这些数字?可能类似于CGRectMake(0, 0, 768, 1004)(iPad 尺寸)
        • 感谢修复。我现在遇到的唯一问题是我第一次点击我的表格视图单元格时会显示一个 nul 值,然后如果我回到表格视图然后点击一个单元格是有效的。你知道为什么我第一次得到一个 nul 值吗?
        • 引用此overflow question,您可能必须将[segue.destinationViewController view]; 添加到prepareForSegue: 的开头如果可行,我会将其放入答案中。告诉我
        猜你喜欢
        • 1970-01-01
        • 2011-03-05
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多