好的,我知道这已经被问过了,我已经尝试了许多不同的方法来使它起作用,但是由于某种原因它不会。我正在尝试将字符串保存到标签的text属性。该标签位于容器视图内的子视图控制器tableVC
中,当UIDatePicker ViewController
的值更改时,我通过IBAction中的parentViewController datePicker
对其进行设置。我努力了:
tableVC *tVC = [[tableVC alloc] init];
tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date];
并且还尝试过制作一个属性
@property (strong, nonatomic) tableVC *tVC;
然后执行:_tVC = [tableVC alloc] init];
_tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date];
但这也不起作用。顺便说一句,我有
#import "tableVC"
。我不希望使用复杂的委托或协议方式,因为我认为自己只是在犯一个菜鸟错误。另外,我已经确认[formatter stringFromDate:self.datePicker.date]
确实使用NSLog(@"%@", [formatter stringFromDate:self.datePicker.date]);
从datePicker返回了正确的,非nil格式的值。编辑
这里有一些更多信息以及整个文件。该表是在情节提要中定义的静态表。我以为这可能是问题的原因,但是即使我只用一个标签将
tableVC
替换为子类的UIViewController
,也无法正常工作。我认为问题出在我如何设置子视图控制器属性。但是,在其他项目中使用prepareForSeque
方法时,我没有这个问题。我可以为目标控制器的属性设置值没有问题,但不能为不是目标控制器的视图控制器的属性设置值。我认为这两个问题是重合的。所有连接都是通过Storyboard正确进行的。ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "tableVC.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *containerView;
@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;
- (IBAction)changedDatePickerSelection:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
tableVC *tVC = [[tableVC alloc] init];
[self addChildViewController:tVC];
[tVC didMoveToParentViewController:self];
NSLog(@"parent");
}
- (IBAction)changedDatePickerSelection:(id)sender
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.timeZone = [NSTimeZone defaultTimeZone];
formatter.timeStyle = NSDateFormatterShortStyle;
formatter.dateStyle = NSDateFormatterMediumStyle;
tableVC *tVC = (tableVC *)self.childViewControllers.lastObject;
tVC.timeLabel.text = [formatter stringFromDate:self.datePicker.date];
_testLabel.text = [formatter stringFromDate:self.datePicker.date];
NSLog(@"%@", [formatter stringFromDate:_datePicker.date]);
NSLog(@"%@", tVC.timeLabel.text);
}
@end
tableVC.h
#import <UIKit/UIKit.h>
@interface tableVC : UITableViewController
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
@end
tableVC.m
#import "tableVC.h"
#import "ViewController.h"
@interface tableVC ()
@property (weak, nonatomic) IBOutlet UITextField *titleTextField;
@property (weak, nonatomic) IBOutlet UISwitch *onOffSwitch;
@property (weak, nonatomic) IBOutlet UIButton *saveButton;
- (IBAction)saveAlarm;
@end
@implementation tableVC
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.timeZone = [NSTimeZone defaultTimeZone];
formatter.timeStyle = NSDateFormatterShortStyle;
_timeLabel.text = [formatter stringFromDate:[NSDate date]];
NSLog(@"%@", _timeLabel.text);
}
- (BOOL)textFieldShouldReturn:(UITextField*)aTextField
{
[aTextField resignFirstResponder];
return YES;
}
- (IBAction)saveAlarm
{
// do something
}
@end
另外,这是我的两幅图像,它们显示了更改
testLabel
的选择时如何更新ViewController
中的datePicker
,但是如何不更新timeLabel
中的tableVC
。第一张图片在更改选择之前,第二张图片在更改之后。为了澄清起见,timeLabel
是第三个单元格右侧的标签,testLabel
是datePicker
上方的标签。http://cl.ly/image/2Q301v0d2m00
http://cl.ly/image/0223183E1t2m
谢谢你的帮助。
最佳答案
如果只有一个子视图控制器,则可以这样操作:
tableVC *tVC = (tableVC *)self.childViewControllers.lastObject;
tVC.timeLabel.text = ....;
如果您有一个以上的孩子,则必须弄清楚哪个孩子是您想要的孩子,并使用objectAtIndex:而不是lastObject。
编辑后:这就是我所做的。我添加了几个属性,并将一些代码移入了viewDidLoad中,因为每次更改日期选择器时都不需要为新的格式化程序分配init:
#import "ViewController.h"
#import "TableVC.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *containerView;
@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;
@property (strong,nonatomic) NSDateFormatter *formatter;
@property (strong,nonatomic) TableVC *tVC;
- (IBAction)changedDatePickerSelection:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.formatter = [[NSDateFormatter alloc] init];
self.formatter.timeZone = [NSTimeZone defaultTimeZone];
self.formatter.timeStyle = NSDateFormatterShortStyle;
self.formatter.dateStyle = NSDateFormatterMediumStyle;
self.tVC = (TableVC *)self.childViewControllers.lastObject;
}
- (IBAction)changedDatePickerSelection:(id)sender {
self.tVC.timeLabel.text = [self.formatter stringFromDate:self.datePicker.date];
_testLabel.text = [self.formatter stringFromDate:self.datePicker.date];
}
除了要大写名称外,我没有对TableVC进行任何更改(您确实应该大写您的类名)。