9

Kullanıcı bir düğmeyi tıkladığında uygulamamda sunulmakta olan bir eylem sayfası biçiminde bir UIAlertController içeren bir iOS uygulamasına sahibim.UIAlertAction tamamlanma bloğu çağrılmadı - iOS

Her şey harika, bir şey dışında, tamamlama blokları bir sebepten dolayı çağrılmıyor.

İşte benim kodunuz: Bu kodu çalıştırırsanız

// Setup the alert information/type. 
UIAlertController *action_view = [UIAlertController alertControllerWithTitle:@"Test title" message:@"test message" preferredStyle:UIAlertControllerStyleActionSheet]; 

// Create and add the cancel button. 
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 

    [action_view dismissViewControllerAnimated:YES completion:^{ 
     NSLog(@"asdhfgjk"); 
    }]; 
}]; 

// Add the action button to the alert. 
[action_view addAction:cancel]; 

// Present the alert to the user. 
[self presentViewController:action_view animated:YES completion:nil]; 

denetleyici alışkanlık çalıştırmak görevden çizgi görürsünüz ve ne olacak İçinde NSLog beyanı. Ancak, NSLog'u silerseniz ve tamamlama bloğunu nil olarak ayarlarsanız, o zaman çalışır .... neden ???

Zaman ayırdığınız için teşekkürler, Dan.

cevap

34

Uyarı denetleyicisini kapatmaya çalışmayın. Uyarı eyleminizin işleyicisinin çağrılmasıyla sizin için işten çıkarılacaktır.

Değiştir "iptal" işlemi:

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
    NSLog(@"asdhfgjk"); 
}]; 
+1

Neden aşağı oy? Cevabın yanlış bir şey varsa, en azından sorunun ne olduğunu açıklayın. – rmaddy

+2

Seni kimin oy kullandığını bilmiyorum, ama cevabınızı oylamadan ve sorunumu mükemmel bir şekilde çözdüğümden geçiyor, teşekkürler. Bunu düşünmeye gelsem, neden uyarı denetleyicisini görevden aldığını söylemem gerekmediğini bilmiyorum. – Supertecnoboff

+0

Bana yardım ettiğinden ve bir sebep belirtmeden önce daha önce de reddedildiğim için kestim. Yolsuzluğa verilecek bir sebep gerektirmelidir. – Alyoshak

2

rmaddy tarafından belirtildiği gibi "iptal" işlemi görünümü denetleyicisi kapatmak gerekir. Eğer değil çağrılan tamamlama bloğu ile aynı sorunu görebilirsiniz

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Dismiss" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { 
NSLog(@"asdhfgjk");}]; 

: hiç Ancak, olsa bile "iptal" eylem ayarlanır. Örneğin, bu (biraz contrived) yöntemi uygulamak: tamamlama blok çağrılmadan önce UIAlertController görevden olur çünkü

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { 
    [[self presentedViewController] dismissViewControllerAnimated:flag completion:nil]; 
} 

de bu etkiye sahip olabilir.