Ios 初始化控制器';在加载视图之前删除视图

Ios 初始化控制器';在加载视图之前删除视图,ios,objective-c,Ios,Objective C,对不起,我的英语不太好。 我有一个UINavigationController,它的根视图控制器是UITableViewController。当用户点击表中任意一行的附件按钮时,另一个视图控制器(DetailViewController)被初始化,传递一些数据以显示,并被推到导航控制器的堆栈上 - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)ind

对不起,我的英语不太好。
我有一个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。 我在谷歌上搜索了一下,了解到每个视图不是在其控制器初始化时初始化的,而是在第一次访问视图时初始化的。
所以我试着改变一下。我用两条语句相互替换(看一下第一段代码)

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

这是一个棘手的问题。 当您的详细信息视图控制器第一次被调用时,它没有被放置。我打赌当您通过
setRestau
进行调试时,所有
IBOutlet
属性,例如
\u titleLabel
,仍然是
nil

因此,一些方法和值被发送到
nil
对象,该对象在运行时运行良好,但除了返回
0
nil
(如果使用返回值)之外,不会做任何事情。 你的价值观会走向涅盘。 然后加载视图控制器的视图,
IBOutlet
从IB获取默认值

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

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


这样,无论视图控制器是第一次按下还是重复按下,值都将正确显示

不要试图从另一个控制器设置标签的值——而是将字符串(或任何其他需要的对象)传递给控制器,并让该控制器在其viewDidLoad方法中填充自己的字符串。不,我有点懒。另外,我还需要在completionBlock中指向restau的指针。您仍然可以将RFRestaurant对象传递给RFRestauDetailViewController,但是让它设置所有自己的标签。更好的OOP实践是让每个对象(本例中的控制器)控制自己的视图,而不是从另一个控制器执行。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    [self.navigationController pushViewController:_detailController animated:YES];
    [_detailController setRestau:_restauList[indexPath.row] atIndex:indexPath.row withCompletionBlock:^(){

    }];
}