在加载视图之前初始化控制器的视图

时间:2014-03-29 20:42:33

标签: ios objective-c

对不起我的英语,这并不完美 我有一个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:^(){

    }];
}

请告诉我,如何通过视图初始化解决此问题。

1 个答案:

答案 0 :(得分:0)

这是一个棘手的问题。 当您的详细信息视图控制器第一次被调用时,它没有被编码。我敢打赌,当您通过setRestau进行调试时,所有IBOutlet属性(例如_titleLabel)仍为nil

因此,一些方法和值被发送到nil对象,它在运行时工作正常但不执行任何操作返回0nil(如果您使用返回值) )。 你的价值观就是必杀技。 之后,加载了视图控制器的视图,IBOutlet从IB获取默认值。

第二次使用相同/相同的视图控制器时,其视图已加载,并且IBOutlets的值已正确设置。

执行以下操作: 在详细视图控制器中为所有值定义属性 在setRestau中首先设置这些属性。 检查所有UIView子类是否都是nil。如果它们不是零,那么设置它们的值就像你已经做的那样。 在viewDidLoad中检查新添加的属性是否为nil。如果不是,则使用它们的值来设置其相应属性的值。

无论视图控制器是第一次按下还是重复按下,您的值都会正确显示。