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:^(){
}];
}