对不起我的英语,这并不完美 我有一个UINavigationController,其根视图控制器是UITableViewController。当用户点击表格中任何一行的附件按钮时,另一个视图控制器(DetailViewController)被初始化,传递一些数据显示并推送到导航控制器的堆栈。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
[_detailController setRestau:_restauList[indexPath.row] atIndex:indexPath.row withCompletionBlock:^(){
}];
//detailController is initialized in UITableViewController's viewDidLoad method
[self.navigationController pushViewController:_detailController animated:YES];
}
DetailController的setRestau:方法
@interface RFRestauDetailViewController ()
{
__weak IBOutlet UILabel *_titleLabel;
__weak IBOutlet UILabel *_ratingLabel;
__weak IBOutlet UILabel *_descriptionLabel;
__weak IBOutlet UILabel *_titleValueLabel;
__weak IBOutlet UILabel *_ratingValueLabel;
__weak IBOutlet UILabel *_descriptionValueLabel;
}
@implementation RFRestauDetailViewController
- (void)setRestau:(RFRestaurant *)restau atIndex:(NSInteger)index withCompletionBlock:(void (^)())completionBlock
{
_titleLabel.text = @"Название:";
_ratingLabel.text = @"Рейтинг:";
_descriptionLabel.text = @"Описание:";
_titleValueLabel.text = restau.title;
_ratingValueLabel.text = [NSString stringWithFormat:@"%i", restau.rating];
_descriptionValueLabel.text = restau.description;
}
@end
DetailViewController显示了我的视图,但是视图显示错误的数据,确切地说,视图显示方式与Interface Builder中的显示方式相同。但如果你点击"返回"在导航栏上,点击表格视图中任意行的附件按钮,DetailViewController将显示包含正确数据的视图。
在调试模式下,我发现DetailViewController中的每个标签都设置为nil。
我用Google搜索了一下,并了解每个视图都是在初始化控制器时初始化的,而不是在首次访问视图时。
所以我试图稍微改变一下。我互相替换了两个语句(一目了然的第一段代码)。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
[self.navigationController pushViewController:_detailController animated:YES];
[_detailController setRestau:_restauList[indexPath.row] atIndex:indexPath.row withCompletionBlock:^(){
}];
}
请告诉我,如何通过视图初始化解决此问题。
答案 0 :(得分:0)
这是一个棘手的问题。
当您的详细信息视图控制器第一次被调用时,它没有被编码。我敢打赌,当您通过setRestau
进行调试时,所有IBOutlet
属性(例如_titleLabel
)仍为nil
。
因此,一些方法和值被发送到nil
对象,它在运行时工作正常但不执行任何操作返回0
或nil
(如果您使用返回值) )。
你的价值观就是必杀技。
之后,加载了视图控制器的视图,IBOutlet
从IB获取默认值。
第二次使用相同/相同的视图控制器时,其视图已加载,并且IBOutlets
的值已正确设置。
执行以下操作: 在详细视图控制器中为所有值定义属性 在setRestau中首先设置这些属性。 检查所有UIView子类是否都是nil。如果它们不是零,那么设置它们的值就像你已经做的那样。 在viewDidLoad中检查新添加的属性是否为nil。如果不是,则使用它们的值来设置其相应属性的值。
无论视图控制器是第一次按下还是重复按下,您的值都会正确显示。