您的第二个iOS应用程序:在两个不同的视图中编辑一个对象

时间:2013-03-04 10:43:11

标签: iphone ios objective-c cocoa-touch

我正在阅读Apple提供的教程,并尝试改进鸟类目击应用程序"My Second iOS App"(有一个MasterView,其中列出了所有输入的目击。如果你点击一个,你将被引导到目击的DetailView。你可以添加目击并被要求输入名称和位置。)

我想把观点分开来输入鸟类的名字和位置。

所以我有两个视图(一个用于输入名称,一个用于输入位置)和一个我想要存储的对象。

在文件BirdSighting.m中,我添加了以下方法

-(id)initWithNameOnly:(NSString *)name date:(NSDate *)date
{
    self = [super init];
    if (self) {
        _name = name;
        _date = date;
        return self;
    }
    return nil;
}

-(id)setLocation:(NSString *)location
{
    if (self) {
        _location = location;
        return self;
    }
    return nil;
}

AddSightingNameViewController.m我实现了以下代码

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"ToLocation"])
    {
        if ([self.birdNameInput.text length])
        {
            BirdSighting *sighting;
            NSDate *today = [NSDate date];
            sighting = [[BirdSighting alloc] initWithNameOnly:self.birdNameInput.text date:today];
            self.birdSighting = sighting;
        }
    }
}

输入名称的视图带有推送到位置视图的segue。其他方面没有太大改变。

现在如何将第一个视图中生成的对象传递给第二个?如何在setLocation中调用此特定对象上的AddSightingLocationViewController.m方法?我必须定义不同的属性吗?在进入该位置后,如何最终使用正确的数据在MasterView中显示对象?

由于此代码尚未运行,我甚至不知道它是否正常工作,我正在尝试做什么。如果这是一个糟糕的代码,请保持温和。

1 个答案:

答案 0 :(得分:2)

这是我一直在使用的方法:

首先,您需要在目标视图控制器中添加一个属性,以保存您想要传递的对象:

@property (strong, nonatomic) BirdSighting *newSighting;

然后将第一个视图控制器中的prepareForSegue方法更改为以下内容:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"ToLocation"])
    {
        if ([self.birdNameInput.text length])
        {
            BirdSighting *sighting;
            NSDate *today = [NSDate date];
            sighting = [[BirdSighting alloc] initWithNameOnly:self.birdNameInput.text date:today];
            self.birdSighting = sighting;

            // Get destination view
            YourDestinationViewController *vc = (YourDestinationViewController *)segue.destinationViewController;

            // Pass birdSighting object to your destination view controller
            [vc setNewSighting:self.birdSighting];

        }
    }
}

我想我最初从这个question

获得了这个方法

值得注意的是,BirdSighting类的位置@property位于.h文件中。你会注意到.m文件中的@synthesize行。

@synthesize指令自动为您创建访问器方法:

@property (nonatomic, copy) NSString *location;

是否自动生成以下方法(但在文件中不可见):

- (NSString *)location;

- (void)setValue:(NSString *)location;

因此,您无需使用以下方法覆盖BirdSighting.m文件中的位置setter方法:

-(id)setLocation:(NSString *)location

如果删除该方法(请注意它应该返回void而不是id),您现在应该能够以下列方式访问BirdSighting对象中的位置变量:

// In this example we are accessing a BirdSighting @property (hence the use of self.sighting)
// @property (strong, nonatomic) BirdSighting *sighting;

// Getter - returns (NSString *)location of the BirdSighting object
[self.sighting location];

// Setter - sets the location property of the BirdSighting object to 'newLocation'
[self.sighting setLocation:newLocation];

希望这能为你解决一些问题!