我正在阅读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中显示对象?
由于此代码尚未运行,我甚至不知道它是否正常工作,我正在尝试做什么。如果这是一个糟糕的代码,请保持温和。
答案 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];
希望这能为你解决一些问题!