我有两个视图控制器
DetailViewController
BlogViewController
我在故事板上设置了“推送”设置标识符“ShowBlog”
我需要从 DetailViewController 下面的UILabel发送博客的标题:
@property (strong, nonatomic) IBOutlet UILabel *TitleLabel;
到名为BlogTitleLabel的 BlogViewController 上的UILabel:
@property (strong, nonatomic) IBOutlet UILabel *BlogTitleLabel;
我知道我需要使用:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"ShowBlog"]) {
// Im struggling with the code
}
}
但我正在努力使用代码进入其中
答案 0 :(得分:2)
使用NSUserDefaults
代码如下:
存储标题:
[[NSUserDefaults standardUserDefaults] setObject:label.title forKey:@"nameForStoredVariableHere"];
[[NSUserDefaults standardUserDefaults] synchronize];
检索存储的标题:
NSString *storedTitle = [[NSUserDefaults standardUserDefaults] objectForKey:@"nameForStoredVariableHere"];
之后,您可以随意使用标题
答案 1 :(得分:2)
prepareForSegue
之前调用 viewDidLoad
,因此不要尝试访问prepareForSegue
中目标视图控制器的任何视图对象。最好在目标中创建一个字符串属性,并在prepareForSegue
方法中设置它。在目标viewController的viewDidLoad
中,将其设置为label
。
答案 2 :(得分:2)
您不应尝试将数据从标签发送到标签。标签是视图对象。它们显示信息并收集用户的输入。他们不存储信息。
此外,您永远不应该尝试直接操纵另一个视图控制器的视图。这违反了其他视图控制器的封装。
两个视图控制器都应具有NSString属性。我们在两个VC上称之为blogTitle。
你的DetailViewController应该在设置过程中将它设置为blogTitle,然后在viewWillAppear:animated中显示该值为titleLabel outlet:
- (void) viewWillAppear: animated;
{
[super viewWillAppear: animated];
self.titleLabel.text = self.blogTitle;
//your other code here
}
然后,在你的prepareForSegue中:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ShowBlog"])
{
BlogViewController *theBlogController = [segue destinationViewController];
theBlogController.blogTitle = self.blogTitle; //Pass the blog title to the other VC
}
}
然后在BlogViewController的viewWillAppear中,将blogTitle复制到它的标题标签:
- (void) viewWillAppear: animated;
{
[super viewWillAppear: animated];
self.titleLabel.text = self.blogTitle;
//your other code here
}
请注意,Cocoa / iOS编程具有强大的命名约定,您应该遵循这些约定。只有文件名和类名应以大写字母开头。方法名称,实例变量名称和属性名称应以小写字母开头。所以你的TitleLabel应该是titleLabel,而BlogTitleLabel应该是blogTitleLabel。