0

我很困惑。我有一个带有用于存储项目详细信息的类的应用程序。称为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];
}

然后它起作用了!

4

2 回答 2

2

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

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

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

...和...

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

为了让事情按照你想要的方式工作,那些必须打印相同的地址。

于 2012-11-27T16:04:38.887 回答
-1

在没有 ARC 的情况下将对象分配给属性时,您应该保留:

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

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

-(void)setItem:(LEItem *)i{
    _item = i;
    ...
}
于 2012-11-27T15:58:10.333 回答