Использование глобальных переменных для передачи значений между классами - PullRequest
0 голосов
/ 09 января 2010

Итак, моя простая идея - создать приложение, которое позволит пользователю сообщать координаты широты и долготы своего местоположения по электронной почте. Вы нажимаете кнопку, экран электронной почты открывается через среду MessageUI, поля «Кому», «Тема» и «Тело» уже предварительно введены, все, что нужно, - это нажать «отправить».

Моя проблема в том, что мне нужно, чтобы координаты широты и долготы были включены в тело письма. Эти координатные переменные создаются в функции - (void) CLLocationManager и превращаются в строки, как мне и нужно. Проблема в том, что электронное письмо отправляется из другой функции, - (void) displayComposerSheet, и я не могу понять, как вставить строки lat / long в тело письма, которое нужно отправить. Пролистав немного через Google, я наткнулся на идею глобальных переменных. Кажется, это то, что мне нужно реализовать. Многие источники говорят: «объявите свои переменные в делегате приложения, и тогда вы сможете использовать их везде, где есть в вашем коде», или, по крайней мере, я так понимаю. Еще раз подчеркну, что я довольно новичок в этой игре. Итак, кажется, что если бы я должен был создать свои строки широты и долготы в файле Delegate.m вместо файла .m проекта, то я смогу вызвать их на досуге и, предварительно, отправить их в мой тело письма.

Я просто не совсем туда, где все мои "вещи" должны идти. Вот что у меня так далеко (работает отлично). Мне просто нужно заменить значение широты по умолчанию "12.3456" и значение долготы "78.9012" с фактическими значениями, сгенерированными CLLocationManager. Любая помощь будет принята с благодарностью. Спасибо!

//Code that generates the Latitude and Longitude strings
//--------------------------------------------------------
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation


{
    //Breaks down the location into degrees, minutes, and seconds.

    int degrees = newLocation.coordinate.latitude;
    double decimal = fabs(newLocation.coordinate.latitude - degrees);
    int minutes = decimal * 60;
    double seconds = decimal * 3600 - minutes * 60;
    NSString *lat = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
                     degrees, minutes, seconds];    
    latitude.text = lat;
    degrees = newLocation.coordinate.longitude;
    decimal = fabs(newLocation.coordinate.longitude - degrees);
    minutes = decimal * 60;
    seconds = decimal * 3600 - minutes * 60;
    NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
                       degrees, minutes, seconds];
    longitude.text = longt;

}





//Code that prepares the email for sending
//------------------------------------------
-(void)displayComposerSheet 
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;

    [picker setSubject:@"New Location Report!"];


    // Set up recipients
    NSArray *toRecipients = [NSArray arrayWithObject:@"pghapps2009@gmail.com"]; 

    [picker setToRecipients:toRecipients];


    // Fill out the email body text 
    NSString *message = @"user reported their location at:";
    NSString *msgLat = @"12.3456";
    NSString *msgLong = @"78.9012";

    NSString *emailBody = [NSString stringWithFormat:@"%@\nLatitude = %@\nLongitude = %@", message, msgLat, msgLong];


    [picker setMessageBody:emailBody isHTML:NO];

    [self presentModalViewController:picker animated:YES];
    [picker release];
}

Ответы [ 2 ]

7 голосов
/ 10 января 2010
//    NSString *msgLat = self->latitude.text; do not do this
//    NSString *msgLong = self->longitude.text; or this
NSString *msgLat = latitude.text;
NSString *msgLong = longitude.text;

Глобальные переменные не нужны (предположим, что оба метода принадлежат одному и тому же классу).

1 голос
/ 10 января 2010

Для этого вам не нужны глобальные переменные. Просто создайте переменные экземпляра (ivars) в классе контроллера и поместите в них значения lat / long. Затем в методе displayComposerSheet используйте значения, которые вы вычислили ранее.

...