如何将日期传递回父类并更改标签?

时间:2014-03-07 03:46:43

标签: ios iphone objective-c uiviewcontroller uidatepicker

我正在编写一个简单的库存应用。它使用导航控制器rootViewControllerUITableView。当您点击tableView中的某一行时,会转到detailsViewController,其中显示所选项目的详细信息。此detailsViewController的底部是UILabel,它显示创建时间的日期,以及允许您更改日期的按钮。单击此按钮时,它会使用datePicker拉出另一个视图控制器。

如何在detailsView中显示日期标签以显示用户选择的新日期?

以下是我的尝试。我对iOS编程比较陌生,所以这可能是一个简单的修复。

@implementation MPDetailViewController

- (IBAction)changeDate:(id)sender {
    MPDateViewController *dated = [[MPDateViewController alloc] init];
    [self.navigationController pushViewController:dated animated:YES];
}

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

MPItem *item = self.item;
self.nameField.text = item.itemName;
self.serialNumberField.text = item.serialNumber;
self.valueField.text = [NSString stringWithFormat:@"%d", item.valueInDollars];

//turns a date into a simple string
if (!self.dateFormatter) {
    self.dateFormatter = [[NSDateFormatter alloc] init];
    self.dateFormatter.dateStyle = NSDateFormatterMediumStyle;
    self.dateFormatter.timeStyle = NSDateFormatterMediumStyle;
    }
self.dateLabel.text = [self.dateFormatter stringFromDate:item.dateCreated];
}

这是日期视图控制器

@implementation MPDateViewController

- (IBAction)dateWasChanged:(id)sender {
    self.nDate = [self.changeDate date];
    NSLog(@"%@", self.nDate);
}

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.view endEditing:YES];
    MPItem *item = self.item;
    item.dateCreated = self.nDate;
    super.dateLabel.text = [super.dateFormatter stringFromDate:self.nDate];
}

我很感激您愿意提供的任何帮助或评论。

2 个答案:

答案 0 :(得分:1)

您必须为它实施协议。作为协议是在这种情况下使用的最佳做法。

您可以在此处找到Protocol的文档。

@protocol MPDateSelectedDelegate

- (void) MDPDateChanged: (NSDate*) date;

@end
@property (nonatomic, assign) id <MPDateSelectedDelegate> delegate;

您可以在更改日期时调用以上委托方法:

[self.delegate MDPDateChanged: newDate];

你必须在父控制器中实现相同的方法,如下所示:

- (void) MDPDateChanged: (NSDate*) date
{
    // Do you stuff at here.
    // date will hold the new changed date from picker view.
    NSLog(@"%@",date.description);
}

答案 1 :(得分:0)

您似乎正在使用IBActions尝试获取在两个不同视图控制器中发生的用户界面事件。不幸的是,这不起作用。在两个视图控制器之间获取信息的最简单方法(至少对我来说)是使用委托。

Here是关于如何使用委托的教程。

你能做的是:

更改:@implementation MPDetailViewController 收件人:@implementation MPDetailViewController <MPDateViewControllerDelegate>

将以下行添加到MPDateViewController.h

@protocol MPDateViewControllerDelegate

- (void) MPDateViewControllerDidChangeDate: (NSString*) date; //I don't know your datatype here, but you can use it as an argument. I'm using NSString as an example

@end
@property (nonatomic, assign) id <MPDateViewControllerDelegate> delegate;

最后,在DateViewController中更改日期后添加此行

[self.delegate MPDateViewControllerDidChangeDate: newDate];

我希望这会有所帮助