在我的HomeController.m
控制器中,我有这个:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
BlahController *dvc = (BlahController *)segue.destinationViewController;
NSLog(@"%@", segue.identifier); // prints out "round"
dvc.coolImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@", @"round"]];
}
这是它应该推动的第二个控制器:
@interface BlahController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *coolImage;
@end
然而,这不起作用。我猜它是因为当时还没有设置插座?我不确定,但是当我将最后一行放在控制器本身的self.coolImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@", @"round"]];
时,它可以工作,所以我知道图像路径是正确的。
我如何设置图像?
答案 0 :(得分:1)
如您所料,如果您在dvc.coolImage
中查看prepareForSegue
,则为零。您必须将详细信息传递给其他(强)属性,然后在视图加载后设置图像。
缩短代码的一个不相关的提示:
... imageNamed:[NSString stringWithFormat:@"%@", @"round"]
可以简单地用字符串文字替换
imageNamed:"round"
顺便说一句,我不鼓励任何人通过让源视图控制器强制目标视图控制器加载其视图来“游戏系统”。试图弥补或解决系统在幕后的行为,使您的代码更加脆弱。
我认为你理解以不同方式做到这一点的原因是将你的属性与他们内部连接的属性分开。
这使您的目标视图控制器成为黑盒子。源不应该知道它正在设置imageView的图像,或者关心是否加载了视图。它只需要提供一个字符串。只有目的地需要知道在内部加载自己的字符串内部做什么。
答案 1 :(得分:1)
您是对的,UIImageView
属性尚未加载。解决方案非常简单 - 创建UIImage
属性并在prepareForSegue:
中设置,然后更新UIImageView
上的viewDidLoad
:
// On your source view controller
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
[segue.destinationViewController setImage:[UIImage imageNamed:@"round"]];
}
// On your destination view controller
@property (strong, nonatomic) UIImage * image;
- (void)viewDidLoad {
super.viewDidLoad();
self.imageView.image = self.image;
}
答案 2 :(得分:1)
-
(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { BlahController *dvc = (BlahController *)segue.destinationViewController;
dvc.myImage = [UIImage imageNamed:@"round"];
}
在Blah.h中
@property (nonatomic, strong) UIImage *myImage;
在Blah.m viewDidLoad方法
self.myImageView.image = self.myImage
;