我很困惑。我有一个带有用于存储项目详细信息的类的应用程序。称为LEItem
。这些项目存储在带有标签的类的商店中LEItemStore
。我有一个包含所有项目的表格的视图。这工作正常。如果您点击一行,它会将此消息发送到 LogbookFirstViewController。
LogbookFirstViewController *logController = [[LogbookFirstViewController alloc] initForNewItem:NO];
NSArray *items = [[LEItemStore sharedStore] allItems];
LEItem *selectedItem = [items objectAtIndex:[indexPath row]];
NSString *description = [selectedItem description];
NSLog(@"%@", description);
[logController setItem:selectedItem];
[self dismissViewControllerAnimated:YES completion:nil];
那是在 TableView 类中。在 LogbookFirstViewController.m 我有
-(void)setItem:(LEItem *)i{
item = i;
NSString *t = [item description];
NSLog(@"In LogbookFirstViewController, returning %@", t);
}
这就是奇怪的地方。这样可行。它输出正确的项目,因此我认为一切都会好起来的。但事实并非如此。item
是一个类级别的属性,所以它应该保留,但它没有。在同一个类中,我已经覆盖了这个方法。
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//NSString *string = [item description];
//NSLog(@"Item = %@", string);
NSLog(@"View did Appear:animated");
int glucoseValue = [item glucose];
NSString *glucoseString = [NSString stringWithFormat:@"%d", glucoseValue];
[glucoseField setText:glucoseString];
int proteinValue = [item protein];
NSString *proteinString = [NSString stringWithFormat:@"%d", proteinValue];
[proteinField setText:proteinString];
int carbsValuue = [item carbs];
NSString *carbsString = [NSString stringWithFormat:@"%d", carbsValuue];
[carbsField setText:carbsString];
int insulinValue1 = [item insulin];
NSString *insulin1String = [NSString stringWithFormat:@"%d", insulinValue1];
[insulinField1 setText:insulin1String];
int insulinValue2 = [item insulin2];
NSString *insulinString2 = [NSString stringWithFormat:@"%d", insulinValue2];
[insulinField2 setText:insulinString2];
//NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
//[dateFormatter setDateStyle:NSDateFormatterShortStyle];
//[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
//NSLog(@" The item was created on %@", [dateFormatter stringFromDate:[item dateCreated]]);
//[dateButton setTitle:[dateFormatter stringFromDate:[item dateCreated]] forState:UIControlStateNormal];
NSString *t = [item description];
NSLog(@"Loading view... Returns: %@", t);
}
我知道这不是最干净的代码,但想法是一样的。它使用与 setItem: 方法完全相同的代码。但是,这总是返回 (null)。为什么?该属性在 viewWillAppear 处似乎消失了。
谢谢。
编辑
我解决了这个问题。如您所见,下面的检查答案确实给出了正确的想法,这是我为解决它所做的。问题是当我发送 setItem: 我使用这段代码来获取 LogbookFirstViewController
LogbookFirstViewController *logController = [[LogbookFirstViewController alloc] initForNewItem:NO];
据我所知,这创建了一个新的 LogbookFirstViewController 实例,因此,现有的没有更改它的 Item 属性,因为属性被分配给一个实例。因此,我只是更改了这个“不可见”属性的 Item 值。
要解决这个问题,必须获取 viewController 的现有实例。为此,我执行了以下操作:
在 LogbookFirstViewController.h 我添加了这个属性
@property (assign) LogbookFirstViewController *instance;
然后,在您的 .m 中合成实例,并在同一个地方将其添加到 viewDidLoad
- (void)viewDidLoad
{
instance = self;
...
然后,在另一个 viewController,entryViewController 中,我也添加了这个 .h
@property (nonatomic, strong) LogbookFirstViewController *logController;
合成它。然后,我以同样的方式使用了我的 didSelectRowAtIndexPath,只是使用了现有的 logController
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSArray *items = [[LEItemStore sharedStore] allItems];
LEItem *selectedItem = [items objectAtIndex:[indexPath row]];
NSString *description = [selectedItem description];
NSLog(@"%@", description);
NSLog(@"Setting controller: %@", logController);
[logController setItem:selectedItem];
[self dismissViewControllerAnimated:YES completion:nil];
}
然后它起作用了!