【问题标题】:errors populating fields of a detail view填充详细视图的字段时出错
【发布时间】:2014-02-12 23:32:01
【问题描述】:

我正在关注 Big Nerd Ranch ios 书,第 11 章。它使用 ItemsViewController 中的表格视图来显示项目列表,如果您单击一个项目,它会将控制权转移到显示详细信息的 DetailViewController关于单个项目。 DetailViewController.xib 在头文件 DetailViewController.h 中声明了这些字段的出口

  __weak IBOutlet UITextField *nameField;
    __weak IBOutlet UITextField *serialNumberField;
    __weak IBOutlet UITextField *valueField;
    __weak IBOutlet UILabel *dateLabel; 

该应用程序在一定程度上运行良好。如果我单击一个项目,新视图将打开,但字段为空。因此,本教程向我们介绍了一种使用每个项目的值填充字段的方法。在引入这个新代码来填充字段后,一旦我单击一个项目以查看其详细信息,应用程序就会崩溃并出现以下错误

2014-02-12 07:18:30.720 Homepwner[3180:a0b] -[UIView setText:]: unrecognized selector sent to instance 0x89ef8c0
2014-02-12 07:18:30.724 Homepwner[3180:a0b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setText:]: unrecognized selector sent to instance 0x89ef8c0'

根据下面的代码摘录,您能否解释为什么当我单击列表中的一项以在详细视图中打开它时应用程序可能会崩溃?

这是我们提供的用于填充字段的代码 DetailViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [nameField setText:[item itemName]];
    [serialNumberField setText:[item serialNumber]];
    [valueField setText:[NSString stringWithFormat:@"%d", [item valueInDollars]]];

    // Create a NSDateFormatter that will turn a date into a simple date string
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];

    // Use filtered NSDate object to set dateLabel contents
    [dateLabel setText:[dateFormatter stringFromDate:[item dateCreated]]];

    // Change the navigation item to display name of item
    [[self navigationItem] setTitle:[item itemName]];
}

ItemViewController.m中,我们在这个函数中添加了中间三行,这样DetailViewController在viewWillAppear:被调用之前就有了它的项目

- (void)tableView:(UITableView *)aTableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detailViewController = [[DetailViewController alloc] init];

    NSArray *items = [[BNRItemStore sharedStore] allItems];
    BNRItem *selectedItem = [ items objectAtIndex: [indexPath row]];

    [detailViewController setItem:selectedItem];
    [[self navigationController] pushViewController:detailViewController animated:YES];
}

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    由于nameField 属性是通过NIB/Storyboard 初始化的,因此您看到的问题最可能的原因是Interface Builder 中的连接不正确。 nameField 出口似乎连接到 UITextEdit 的父级,而不是 UITextEdit 本身。

    删除并重新创建 nameField 属性应该可以解决问题。首先,从代码中删除该属性。然后,从文本字段按住 Control 拖动到 DetailViewController.m 内的 DetailViewController 的类扩展中,并将属性命名为 nameField

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 2013-08-15
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多