Soru & Cevap

UIAlertview ve MapKit kullanımı ...

06.08.2014 - 10:54

Merhaba arkadaşlar, 

Bir projede benden önce UIAlertview yerine MBAlertview kullanılmış, ancak bu kütüphane iphone 5s lerde sorun oluşturuyor. Ekrana gelen uyarıda butonların yazıları görünmüyor. MBAlertview kullanılan yerleri UIAlertview ile değiştirdiğimde sorun çözülüyor. Ancak eğer uyarı ekranındaki butonlar bir fonksiyon çalıştırıyorsa onu çözmek için delegate kullanmam gerekiyor... Maalesef onda da bir yerde kafam karıştı. Method içinde method yazmam gerekiyor gibi bir durum oluştu, kodları paylaşıyorum... Aşağıdaki kod için UIAlertview i kullanabilirsem sorun kalmayacak.. 

[code]

+ (void)startNavigationAppWithTargetLocation:(CLLocationCoordinate2D)targetLocation destinationName:(NSString *)destinationName

{

    MBAlertView *alert = [MBAlertView alertWithBody:@"Yol tarifi uygulamasına geçmek istediğinizden emin misiniz?" cancelTitle:@"Hayır" cancelBlock:nil];

    [alert addButtonWithText:@"Evet" type:MBAlertViewItemTypePositive block:^{

        

        Class itemClass = [MKMapItem class];

        if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {

            // iOS 6 MKMapItem available

            MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate:targetLocation addressDictionary:nil];

            MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark:place];

            destination.name = destinationName;

            NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];

            NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:

                                     MKLaunchOptionsDirectionsModeDriving,

                                     MKLaunchOptionsDirectionsModeKey, nil];

            [MKMapItem openMapsWithItems:items launchOptions:options];

        }

        else

        {

            [SVProgressHUD showWithStatus:@"Koordinatlar alınıyor." maskType:SVProgressHUDMaskTypeBlack];

            [[DMLocationManager shared] obtainCurrentLocationAndReverse:NO withAccuracy:kCLLocationAccuracyBest useCache:NO completition:^(CLLocation *location, CLPlacemark *placemark, NSError *error) {

                

                if (!error)

                {

                    [SVProgressHUD dismiss];

                    

                    NSString *stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=%g,%g&daddr=%g,%g", location.coordinate.latitude, location.coordinate.longitude, targetLocation.latitude, targetLocation.longitude];

                    NSURL *url = [NSURL URLWithString:stringURL];

                    [[UIApplication sharedApplication] openURL:url];

                }

                else

                {

                    [SVProgressHUD dismiss];

                    

                    // Display error message.

                    MBAlertView *errorAlert = [MBAlertView alertWithBody:@"Koordinatlar saptanamadı" cancelTitle:@"Tamam" cancelBlock:nil];

                    [errorAlert addToDisplayQueue];

                }

            }];

        }

    }];

    [alert addToDisplayQueue];

}

[/code]

9 Görüntülenme

3 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-2335-1379625106.jpg
rocxteady
06.08.2014 - 02:38

Buyrun:

Öncelikle Alert oluşturuyoruz delegate verip:

[code]

+ (void)startNavigationAppWithTargetLocation:(CLLocationCoordinate2D)targetLocation destinationName:(NSString *)destinationName

 

{

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Yol tarifi uygulamasına geçmek istediğinizden emin misiniz?" delegate:self cancelButtonTitle:@"Hayır" otherButtonTitles:@"Evet", nil];

    [alert show];

}

[/code]

 

Sonra Evet tıklanmışsa ne yapacağını söylemek için delegate metodunun içerisine yazıyoruz:

[code]

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

    if (alertView.tag == 0) {

        if (alertView.tag == 1) {

            

                Class itemClass = [MKMapItem class];

                

                

                if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {

                    

                    

                    // iOS 6 MKMapItem available

                    

                    

                    MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate:targetLocation addressDictionary:nil];

                    

                    

                    MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark:place];

                    

                    

                    destination.name = destinationName;

                    

                    

                    NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];

                    

                    

                    NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:

                                             

                                             

                                             MKLaunchOptionsDirectionsModeDriving,

                                             

                                             

                                             MKLaunchOptionsDirectionsModeKey, nil];

                    

                    

                    [MKMapItem openMapsWithItems:items launchOptions:options];

                    

                    

                }

                

                

                else

                    

                    

                {

                    

                    

                    [SVProgressHUD showWithStatus:@"Koordinatlar alınıyor." maskType:SVProgressHUDMaskTypeBlack];

                    

                    

                    [[DMLocationManager shared] obtainCurrentLocationAndReverse:NO withAccuracy:kCLLocationAccuracyBest useCache:NO completition:^(CLLocation *location, CLPlacemark *placemark, NSError *error) {

                        

                        

                        

                        

                        

                        if (!error)

                            

                            

                        {

                            

                            

                            [SVProgressHUD dismiss];

                            

                            

                            

                            

                            

                            NSString *stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=%g,%g&daddr=%g,%g", location.coordinate.latitude, location.coordinate.longitude, targetLocation.latitude, targetLocation.longitude];

                            

                            

                            NSURL *url = [NSURL URLWithString:stringURL];

                            

                            

                            [[UIApplication sharedApplication] openURL:url];

                            

                            

                        }

                        

                        

                        else

                            

                            

                        {

                            

                            

                            [SVProgressHUD dismiss];

                            

                            

                            UIAlertView *alertError = [[UIAlertView alloc] initWithTitle:nil message:@"Koordinatlar saptanamadı" delegate:nil cancelButtonTitle:@"Tamam" otherButtonTitles:nil];

                            [alertError show];

                            

                            

                            

                        }

                        

                        

                    }];

                    

                    

                }

           

        }

    }

}

[/code]

Kerim ÇAĞLAR
07.08.2014 - 09:43
Sanmıyorum, siz denediniz mi böyle birşey? çalışmayacaktır..
Ulaş Sancak
07.08.2014 - 10:25
Çalışmayacağını düşündüğün şey nedir? Alert View'in delegate metodu static olarak da çalışıyor. Bunu soruyorsan denedim evet. Static metodun içerisinde Alert View oluşturup delegate set ettim ve metod çağrıldı.
Kerim ÇAĞLAR
07.08.2014 - 10:53
Hayır ondan bahsetmedim. Alertview ı çağırdığın methodla, delegati kontrol ettiğin methodlarda sorun var. Çünkü ikinci yazdığın fonksiyonda üstteki fonksiyonda sorun olmayıp ama alttaki fonksiyonda sorun olacak şeyler çıkar..
Ulaş Sancak
07.08.2014 - 05:34
Nedir o sorunlar? Biraz detaylı anlatsan.
Ulaş Sancak
07.08.2014 - 05:37
Anladım sen methodun parametrelerini diyorsun. O zaman block'u kendiniz yazmanız gerekecek. AlertView'in içerisinde.
Kerim ÇAĞLAR
06.08.2014 - 04:45
Cevabınız için teşekkür ederim ama bunun çalışacağını, sanmıyorum çünkü yukardaki statik method sayesinde konum bulma veya destination target gibi şeyleri tanımaz..
Ulaş Sancak
06.08.2014 - 05:02
Alert View delegate methodunun -'sini + yapıver çalışsın.
Profile picture for user kerim.caglarr
kerim.caglarr
06.08.2014 - 11:42

Öncelikle cevabınız için teşekkür ederim, evet bu yöntemi biliyorum, sorumda bunu yapmaktan kaçınmak istediğimi anlatmaya çalıştım ama anlatamamışım :) Burdaki gibi bir block yapısı kullanılsa daha az iş yapılmış olur diye düşündüm. Son çare delegate kullanacağım.

picture-3650-1421928561.jpg
anilsozeri
06.08.2014 - 11:27

Merhaba,

UIAlertView kullanıyorsanız ve butona basıldığında bir fonksiyon tetikletmeniz gerekiyorsa eğer mecburen UIAlertViewDelegate protokolünü .h dosyasınıza dahil etmeniz gerekmektedir.

[code]

@interface ViewController : UIViewController<UIAlertViewDelegate>

[/code]

UIAlertView oluşturma;

[code]

UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Hayır" otherButtonTitles:@"Evet", nil];
    [alertView show];

[/code]

UIAlertView'i kullanarak hangi butona bastığınızı anlamanızı sağlayan delegate metodu;

[code]

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0) {
        //0. indisteki buton
    }
    else if(buttonIndex == 1){
        //1. indisteki buton
    }
}

[/code]

Seçtiğiniz butona göre yapacagınız işlemleri de metot haline getirerek yukarıdaki metotta uygun olan yerlerde metotlarınızı tetikletebilirsiniz. Delegate metotların içine tekrar metot yazmak istemiyor musunuz onu tam anlamayamadım ama eğer benim anladığım gibiyse neden böyle bir şey istemiyorsunuz?

İyi çalışmalar.