在UIWebView中显示来自不同视图控制器的URL

时间:2015-02-16 00:15:29

标签: ios objective-c uitableview uiwebview

   RecipesTableViewController.m

    #import "RecipesTableViewController.h"
    #import "RecipeTableViewCell.h"
    #import "IngredientsViewController.h"
    #import "Recipe.h"
    #import "RecipeDetailViewController.h"

    @interface RecipesTableViewController () {

        NSMutableArray *recipesArray;

    }

    @end

    @implementation RecipesTableViewController

    - (void)viewDidLoad {
        [super viewDidLoad];

//api from recipepuppy 
        NSString *recipeUrlString = [NSString stringWithFormat:@"http://www.recipepuppy.com/api/?i=%@",self.searchRecipe];

//adding percentage on the textfield when the user is searching
        NSString *formattedString = [recipeUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//download data 
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString: formattedString]];


//put data into a dictionary
        NSDictionary *recipeDictinary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

//then put the dictionary into an array
        recipesArray = [[NSMutableArray alloc]init];
        for (NSDictionary *recipeDict in [recipeDictinary objectForKey:@"results"]) {


            Recipe *recipe = [[Recipe alloc]initWithTitle:[recipeDict objectForKey:@"title"] andRecipeIngredients:[recipeDict objectForKey:@"ingredients"] andImageURL:[NSURL URLWithString:[recipeDict objectForKey:@"thumbnail"]] andRecipeWebUrl:[recipeDict objectForKey:@"href"]];


            [recipesArray addObject:recipe];
            NSLog(@"%@", recipeDict);
        }
    }



    #pragma mark - Table view data source

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        // Return the number of sections.
        return 1;
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        // Return the number of rows in the section.

        return [recipesArray count];
    }


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        RecipeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"recipeCell" forIndexPath:indexPath];

        [cell drawTheCell:[recipesArray objectAtIndex:indexPath.row]]; 

        return cell;
    }
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if([segue.identifier isEqualToString:@"recipeDetail"]) {
            //NSIndexPath *indexPath =[self.tableView indexPathForSelectedRow];

            RecipeDetailViewController *recipeDetail = segue.destinationViewController;

            recipeDetail.title = @"Recipe";


        }

      }

    @end

短篇小说:     我正按照我班上的成分制作配方。     我有一个UITableViewControllre解析来自api的内容,并且我在数组中有api的对象。在那个数组中,我有“结果”,在这些结果中我有网址,标题,成分和配方图像。我想将URL发送到另一个视图控制器的WebView,但我不能。每当我选择配方时,应用程序崩溃以查看webview。我被困在这三天,我很沮丧,我知道问题是我链接到webview,因为数组打印网址,但没有显示在webview上。

这是我的表视图控制器,其中我的api是,并且准备segue到webview所在的视图控制器。

    RecipeTableViewCell.m

    #import <UIKit/UIKit.h>
    #import "Recipe.h"

    @interface RecipeTableViewCell : UITableViewCell
    @property (strong, nonatomic) IBOutlet UILabel *recipeUrl;
    @property (strong, nonatomic) IBOutlet UILabel *recipeTitle;
    @property (strong, nonatomic) IBOutlet UILabel *recipeIngredients;
    @property (strong, nonatomic) IBOutlet UIImageView *recipeImage;

    -(void)drawTheCell:(Recipe *)recipeObject;

    @end

    RecipeTableViewCell.m

    -(void)drawTheCell:(Recipe *)recipeObject {

        self.recipeTitle.text = recipeObject.title;

        self.recipeIngredients.text = recipeObject.ingredients;

        self.recipeUrl.text = recipeObject.recipeWebUrl; 

        NSData *imageData = [NSData dataWithContentsOfURL:recipeObject.imageURL];
        self.recipeImage.image = [UIImage imageWithData:imageData];

    #import "RecipeDetailViewController.h"
    #import "RecipeTableViewCell.h"



    @interface RecipeDetailViewController ()
    @property (strong, nonatomic) IBOutlet UIWebView *recipeWebView;

    @end

    RecipeDetailViewController.m

    @implementation RecipeDetailViewController

    - (void)viewDidLoad {
        [super viewDidLoad];

        Recipe *recipe = [[Recipe alloc] init];

        NSURL *url = [NSURL URLWithString: recipe.recipeWebUrl];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        [self.recipeWebView loadRequest:request];


    }

    RecipeDetailViewController.h

    #import <UIKit/UIKit.h>

    @interface RecipeDetailViewController : UIViewController
    @property (nonatomic, strong ) NSString *recipeWebUrlString;

这是我的手机,在这里显示标题,成分和图像,并且工作正常。

2 个答案:

答案 0 :(得分:1)

这里有一个冗长的答案,但我会尽量保持简短,希望它有意义。

首先,我不知道你在哪里调用performSegueWithIdentifier:这意味着你可能会通过故事板直接点击单元格到下一个视图。这对于简单的按键操作非常有用,但不适合选择需要从中发送信息的单元格。我建议在didSelectRowAtIndexPath:中调用segue。故事板上的segue应该直接从一个视图控制器转到另一个视图控制器,而不是直接从表格单元格。别忘了再次设置标识符。

像这样在代码中调用segue。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"recipeDetail" sender:nil]; //you could also pass the cell with if you want
}

在准备segue的第二步中,您没有设置所需的URL,只是设置下一个视图控制器的标题。看起来你接近你想要的东西,因为我可以看到你已经在看索引路径,但评论了它。你应该抓住那里的单元格并将url设置为recipeDetail。您也可以通过发件人传递单元格。

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

    if([segue.identifier isEqualToString:@"recipeDetail"]) 
    {
        NSIndexPath *indexPath =[self.tableView indexPathForSelectedRow];
        RecipeTableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

        RecipeDetailViewController *recipeDetail = segue.destinationViewController;

        recipeDetail.title = @"Recipe";
        recipeDetail.recipeWebUrlString = cell. recipeUrl.text;


    }
}

如果所有其他方法都失败,第三件事就是开始将NSLogs放在各处。您可以在视图中记录URL,并在下一个视图中加载,并查看它是否已设置。接下来你应该看看你在哪里设置它,看起来没有我认为的地方=)

所有这一切都说明了我不会转发单元格上的文本,而是从数组中获取配方并将其传递给segue。

我希望这有助于或至少让你指出正确的方向。

答案 1 :(得分:1)

Skyler的回答正朝着正确的方向前进,但它缺少一些关键的部分......

是的,你需要传递prepareForSegue:中的网址网字符串,就像他建议的那样,即

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if([segue.identifier isEqualToString:@"recipeDetail"]) 
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        RecipeTableViewCell *cell = (RecipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];

        RecipeDetailViewController *recipeDetail = segue.destinationViewController;

        recipeDetail.title = @"Recipe";
        recipeDetail.recipeWebUrlString = cell.recipeUrl.text;
    }
}

但问题是您没有使用recipeWebUrlString来执行您的网址请求。

相反,您在.m中创建一个空的Recipe对象,从而使用空网址来执行网络请求,即

Recipe *recipe = [[Recipe alloc] init];
NSURL *url = [NSURL URLWithString: recipe.recipeWebUrl];

而是用以下内容替换这两行(^):

NSURL *url = [NSURL URLWithString:self.recipeWebUrlString];

要使用您刚刚从RecipesTableViewController传入的网址。