3

私はAppleが提供するチュートリアルを試し、鳥の目撃用のアプリである 「MySecondiOSApp」を改善しようとしました。(入力されたすべての目撃情報が一覧表示されるMasterViewがあります。1つをクリックすると、目撃情報のDetailViewに移動します。目撃情報を追加すると、名前と場所の入力を求められます。)

鳥の名前と場所を入力するためのビューを分割したいと思います。

したがって、2つのビュー(1つは名前の入力用、もう1つは場所の入力用)と、保存したいオブジェクトがあります。

ファイル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;
        }
    }
}

名前を入力するためのビューは、ロケーションビューへのプッシュセグエでつながります。他にあまり変更はありません。

では、最初のビューで生成されたオブジェクトを2番目のビューに渡すにはどうすればよいですか?setLocationそして、この特定のオブジェクトのメソッドをどのように呼び出すのAddSightingLocationViewController.mですか?別のプロパティを定義する必要がありますか?そして、場所を入力した後、最終的にマスタービューに正しいデータでオブジェクトを表示するにはどうすればよいですか?

このコードはまだ機能していないので、機能しているかどうか、何をしようとしているのかさえわかりません。ですから、これがくだらないコードである場合は、優しくしてください。

4

1 に答える 1

2

これは私が使用している方法です:

まず、渡すオブジェクトを保持するために、宛先のViewControllerにプロパティを追加する必要があります。

@property (strong, nonatomic) BirdSighting *newSighting;

次に、最初のViewControllerの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ファイル内の場所のsetterメソッドを次のようにオーバーライドする必要はありませんでした。

-(id)setLocation:(NSString *)location

そのメソッドを削除すると(idではなくvoidが返されることに注意してください)、次の方法で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 に答える