4

オブジェクトの色を変更する必要がありMKPointAnnotationますが、私が書いたメソッドは赤いピンしか生成しないようです。メソッドは正常に動作しますが、指定された定数のいずれかのパラメーターを渡して関数を呼び出すと、マップに表示されるすべてのピンが赤になります (デフォルト)。何かご意見は?以下のコード。

    -(MKAnnotationView*) returnPointView: (CLLocationCoordinate2D) location andTitle: (NSString*) title andColor: (int) color{
        /*Method that acts as a point-generating machine. Takes the parameters of the location, the title, and the color of the 
         pin, and it returns a view that holds the pin with those specified details*/

        MKPointAnnotation *resultPin = [[MKPointAnnotation alloc] init];
        MKPinAnnotationView *result = [[MKPinAnnotationView alloc] initWithAnnotation:resultPin reuseIdentifier:Nil];
        [resultPin setCoordinate:location];
        resultPin.title = title;
        result.pinColor = color;
        return result;
        }

//Function that calls above method
    for(Party *party in allParties){
            if(!party.alreadyAdded){
                CLLocationCoordinate2D location = [party getPartylocation];
                NSString *partyTitle = [party getPartyName];
                MKAnnotationView *partyPin = [self returnPointView:location andTitle:partyTitle andColor:MKPinAnnotationColorGreen];
                [self.map addAnnotation:partyPin.annotation];
                NSLog(@"Adding Successful!");
                party.alreadyAdded = YES;
            }

        }
4

2 に答える 2

4

ViewController のヘッダーで MKMapViewDelegate プロトコルに準拠する必要があります。

@interface mapViewController : UIViewController <MKMapViewDelegate>
@end

次に、実装でメソッドを記述する必要があります。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

これは、注釈が描画されるたびに呼び出されます。アノテーションを追加するときだけでなく、メソッドを呼び出す必要があるのはここです。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{

    MKAnnotationView *pinView = [self returnPointView:annotation.coordinate andTitle:annotation.title andColor:MKPinAnnotationColorGreen];

    return pinView;
}

最後に、ViewController を viewDidLoad の UIMapView デリゲート デリゲートとして設定します。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self.mapView setDelegate:self];
}

Xcode の MapCallouts サンプル プロジェクトをご覧になることをお勧めします。明確でシンプルです。

同様に、dequeueReusableAnnotationViewWithIdentifierメモリ効率を高めるために を使用する必要があります (例のように)。

于 2013-10-01T23:50:47.520 に答える
3

戻り値が間違っている可能性があります... MKPinAnnotationView の代わりに MKAnnotationView を返しています... MKAnnotationView には pinColor と呼ばれる属性がありません..これは機能するはずです

-(MKPinAnnotationView*) returnPointView: (CLLocationCoordinate2D) location andTitle: (NSString*) title andColor: (int) color{
    /*Method that acts as a point-generating machine. Takes the parameters of the location, the title, and the color of the 
     pin, and it returns a view that holds the pin with those specified details*/

    MKPointAnnotation *resultPin = [[MKPointAnnotation alloc] init];
    MKPinAnnotationView *result = [[MKPinAnnotationView alloc] initWithAnnotation:resultPin reuseIdentifier:Nil];
    [resultPin setCoordinate:location];
    resultPin.title = title;
    result.pinColor = color;
    return result;
    }


//Function that calls above method
    for(Party *party in allParties){
        if(!party.alreadyAdded){
            CLLocationCoordinate2D location = [party getPartylocation];
            NSString *partyTitle = [party getPartyName];
            MKPinAnnotationView *partyPin = [self returnPointView:location andTitle:partyTitle andColor:MKPinAnnotationColorGreen];
            [self.map addAnnotation:partyPin.annotation];
            NSLog(@"Adding Successful!");
            party.alreadyAdded = YES;
        }

    }
于 2013-10-01T22:33:44.970 に答える