2012-11-21 96 views
2

好吧,我知道这已被问及之前,我已经尝试了许多不同的方法来使这项工作,但由于某种原因它不会。我试图将字符串保存到标签的文本属性。该标签位于容器视图中名为tableVC的子视图控制器中,并且当UIDatePicker的值更改时,我将它从IBAction中的parentViewController,ViewController中进行设置。我曾尝试:设置子视图控制器属性

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"。我不想要一个复杂的委托或协议方式来做这件事,因为我认为我只是在做一个noob错误。此外,我已确认[formatter stringFromDate:self.datePicker.date]确实使用NSLog(@"%@", [formatter stringFromDate:self.datePicker.date]);从datePicker返回适当的非零格式值。

编辑

这里是整个文件一起多一点的信息。该表是一个在Storyboard中定义的静态表。我认为这可能是问题的原因,但即使我只用一个标签取代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 

此外,这里是我的两张图片,显示datePicker的选择更改时ViewControllertestLabel如何更新,但tableVCtimeLabel不是如何更新的。第一张图像是在选择更改之前,第二张是之后。为了澄清,timeLabel是第三个单元右侧的标签,而testLabel是直接位于datePicker之上的标签。

http://cl.ly/image/2Q301v0d2m00

http://cl.ly/image/0223183E1t2m

感谢您的帮助。

+0

你的'timeLabel'属性是什么样的? – mkral

+0

@mkral'@property(弱,非原子)IBOutlet UILabel * timeLabel; ' –

+0

您是以编程方式或使用InterfaceBuilder添加'tableVC'吗?如果您使用的是界面构建器,您是否连接了所有的网点? – mkral

回答

4

如果你只有一个孩子视图控制器,你可以做这样的:

tableVC *tVC = (tableVC *)self.childViewControllers.lastObject; 
tVC.timeLabel.text = ....; 

如果你有一个以上的孩子,那么你必须搞清楚哪一个是你想要的,并使用objectAtIndex:而不是lastObject。

编辑完成后:这就是我所做的。我加了一些属性和移动一些代码到viewDidLoad中,因为没有必要每次更改日期选取时间的Alloc初始化一个新的格式化:

#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什么比到其他把名字大写(你真的应该大写你的类名)。

+0

不幸的是,这并没有奏效。请参阅我修改的帖子以获取更多信息。谢谢您的帮助。 –

+0

@MusicMathTech,我认为你的问题是你刚刚发布的所有代码。如果你通过添加容器视图在IB中设置它,然后自动给你一个嵌入式控制器,你不需要任何代码来设置子视图控制器。您不需要分配init tVC并将其添加为子视图控制器的代码。 – rdelmar

+0

好吧,我试着注释掉alloc init和'addChildViewController'和'didMoveToParentViewController'。然后我注释掉了@属性(弱,非原子)的IBOutlet UIView * containerView',并从Storyboard中的容器视图中移除了插座。我也改变了'tableVC * tVC = [[tableVC alloc] init];'changedDatePickerSelection'中的行为'table * tVC;'这仍然不起作用。有任何想法吗?谢谢。 –

0

每次你正在做alloc/init的时候,正在制作一个新的视图控制器的实例。您需要一个指向已经在屏幕上的现有实例的指针,可能是使用插座(如果在接口构建器中设置的话)。

+0

我不确定你的意思。我正在使用故事板。 –