为什么一处房产会基本消失?对象-C,可可



我很困惑。我有一个应用程序,它有一个用于存储项目详细信息的类。称为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类中。在日志FirstViewController.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;
...

然后,在另一个视图控制器entriesViewController中,我也添加了.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];
}

那就行了!

您有一行创建了LogbookFirstViewController,但实际上并没有导致它显示任何内容(推送或呈现)。由于它是一个局部变量,因此无论该控制器的哪个实例正在加载它的视图,都与您在所示代码中初始化的视图不同。

您可以通过添加几个NSLog行来验证这一点,例如:

NSLog(@"Setting controller: %@", logController);  // Insert before existing line
[logController setItem:selectedItem];

[super viewWillAppear:animated];
NSLog(@"Viewing controller: %@", self);  // Insert after existing line

为了让事情按照你想要的方式进行,必须打印相同的地址。

将对象分配给没有ARC:的属性时,应保留

-(void)setItem:(LEItem *)i{
_item = [i retain];
...
}

如果您将属性与ARC一起使用,则编写_item = i;:

-(void)setItem:(LEItem *)i{
_item = i;
...
}

最新更新