我正在跟随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];
}
答案 0 :(得分:0)
由于nameField
属性是通过NIB / Storyboard初始化的,因此您看到问题的最可能原因是Interface Builder中的连接不正确。似乎nameField
出口连接到UITextEdit
的父级,而不是UITextEdit
本身。
删除并重新创建nameField
属性应解决问题。首先,从代码中删除属性。然后,控制 - 从文本字段拖动到DetailViewController
内的DetailViewController.m
类扩展,并将属性命名为nameField
。