设置子视图控制器属性

时间:2012-11-21 20:49:06

标签: iphone ios xcode uiviewcontroller uilabel

好的,我知道之前已经问过这个问题,我已经尝试了很多不同的方法来完成这项工作,但由于某些原因它不会。我试图将字符串保存到标签的文本属性。标签位于容器视图中名为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返回正确的非零格式化值。

修改

这里有更多信息以及整个文件。该表是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

此外,这是我的两张图片,展示testLabel选择更改时ViewController的{​​{1}}如何更新,以及datePicker如何更新timeLabel tableVC没有。第一张图像在选择更改之前,第二张图像在之后。为了澄清,timeLabel是第三个单元格右侧的标签,testLabeldatePicker正上方的标签。

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

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

如果你有多个孩子,那么你必须找出你想要的孩子,并使用objectAtIndex:而不是lastObject。

编辑后:这就是我所做的。我添加了一些属性并将一些代码移动到viewDidLoad中,因为每次更改日期选择器时都不需要为每个格式化程序分配一个新的格式化程序:

#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中的任何内容,只是将名称大写(你真的应该把你的类名大写)。

答案 1 :(得分:0)

每次执行alloc / init时,都会生成视图控制器的 new 实例。您需要一个指向已经在屏幕上的现有实例的指针,可能是通过使用插座(如果这是在界面生成器中设置的)。