如何使NSArray成为cell.textLabel.text的可接受值?

时间:2015-03-29 00:02:28

标签: ios objective-c uitableview nsarray cell

简单食谱应用

在我的recipeBook应用程序中,我有两个UITableViewControllers。第一个UITableViewController包含一个UITableView,其中包含配方名称列表。如果选择一个单元格,您将转到第二个UITableViewController。第二个UITableViewController包含一个带有成分列表的UITableView。

在我的应用程序中,我使用RecipeObject类,它包含两个属性(名称(类型:NSString)和成分(类型:NSArray)。配方对象都在RecipeData类中声明,如下所示:

RecipeObject *recipe1 = [[RecipeObject alloc]init];
recipe1.name = @"Fresh Coconut Cake";
recipe1.ingredients = [NSArray arrayWithObjects:@"Coconut cups", @"Milk", @"Baking powder", @"Butter", @"Sugar", @"Eggs", nil];

在第一个UITableViewController中,我设法打印出每个单元格的配方名称。请参阅以下代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static NSString *cellIdentifier = @"recipeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

TostiObject *recipes = [self.recipes objectAtIndex:indexPath.row];
cell.textLabel.text = recipes.name;

return cell;

我在名为self.recipes的First UITableViewController中声明了一个NSArray属性来连接RecipeData。我还在第二个UITableViewController中执行了以下操作。

self.recipes = [RecipeData allRecipes];

问题发生在第二个UITableViewController:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"ingredientCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

RecipeObject *recipe = [self.recipes objectAtIndex:indexPath.row];

cell.textLabel.text = [recipe.ingredients objectAtIndex:indexPath.row];

return cell;

因为cell.textLabel.text只接受NSString值而recipe.ingredients是NSArray。我想将成分数据(NSArray)连接到第二个UITableViewController中的cell.textLabel.text。

也许有人可以帮我解决这个问题。所有帮助都非常感谢!

- 其他信息 -

prepareForSegue方法(第一个UITableViewController):

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"ingredients"]) {
        SecondTableViewController *IngredientsTVC = (SecondTableViewController *)segue.destinationViewController;
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        RecipeObject *recipe = [self.recipes objectAtIndex:indexPath.row];
        IngredientsTVC.recipeContainer = recipe.ingredients;

1 个答案:

答案 0 :(得分:0)

您应该只将一个配方对象传递给第二个表视图控制器(因此我不明白您在RecipeObject *recipe = [self.recipes objectAtIndex:indexPath.row]中使用cellForRowAtIndexPath的原因)。然后,您可以使用recipe.ingredients作为用于填充表的数组。您仍然可以在cellFroRowAtIndexPath中使用此行,

cell.textLabel.text = [recipe.ingredients objectAtIndex:indexPath.row];

您还应该将recipe.ingredients.count传递给numberOfRowsInSection

编辑后:

有些事情并不清楚你在做什么。您似乎希望SecondTableViewController显示来自第一个控制器的单个所选配方的成分列表。所以,首先,根本不需要在SecondTableViewController中使用行self.recipes = [RecipeData allRecipes];控制器只需要知道通过prepareForSegue传递的一个配方。我假设recipeContainer是SecondTableViewController的数组属性,它是成分数组;这就是填充表格所需要的(顺便说一句,没有必要在prepareForSegue中传递它,因为你可以从你传递的配方对象中获取它)。所以,你应该这样做的方法是,首先,删除你在prepareForSegue中显示的最后一行;你不需要它。

在SecondTableViewController .h

@property (strong,nonatomic) RecipeObject *recipe;

在SecondTableViewController .m

@interface SecondTableController ()
@property (strong,nonatomic) NSArray *ingredients;
@end

@implementation SecondTableController


- (void)viewDidLoad {
    [super viewDidLoad];
    self.ingredients = self.recipe.ingredients;
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.ingredients.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = self.ingredients[indexPath.row];
    return cell;
}

如果需要,可以使用self.title = recipe.name

在viewDidLoad中设置SecondViewController的标题