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;
这是我的手机,在这里显示标题,成分和图像,并且工作正常。
答案 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
传入的网址。