3

我正在阅读 Apple 提供的教程,并尝试改进“我的第二个 iOS 应用程序”,这是一款用于观鸟的应用程序。 (有一个 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;
        }
    }
}

用于输入名称的视图通过 push segue 引导到位置视图。其他方面没有太大变化。

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

由于这段代码还没有工作,我什至不知道它是否工作,我想做什么。所以请温柔,如果这是糟糕的代码。

4

1 回答 1

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];

        }
    }
}

我想我最初是从这个问题中得到这个方法的

还值得注意的是,BirdSighting 类在它的 .h 文件中有一个位置 @property 并且您会注意到 .m 文件中的 @synthesize 行。

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

@property (nonatomic, copy) NSString *location;

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

- (NSString *)location;

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

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

-(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];

希望这可以为您解决一些问题!

于 2013-03-04T12:14:26.597 回答