8

Özel bir konteyner görünüm denetleyicisi (MainViewController) olduğunu varsayalım eylemin üst bildirmek basıldığında bir sonraki görüntü denetleyicisine ilerlemeniz gerekir. Bu yüzden bu eylemin MainViewController'ına bildirmem gerekiyor. Bunu yapmanın en iyi yolu nedir?Konteyner Görüntüle Kontrolörler ben böyle bir şey yapmak nerede

Özel bir kapsayıcı kullanıyorum çünkü görünüm denetleyicileri arasında özel geçişler yapmam gerekiyor. "Git" düğmesine basıldığında, yeni görünüm denetleyicisinden gelen görünümler yerine doğru hareket ederken HomeViewController'daki bazı görünümler harekete geçer.

Açıkçası HomeViewController'a MainViewController türünde bir özellik verebilir ve bu şekilde aramalar yapabilirim, ancak konteyner görüntüleme denetleyicisi API'siyle daha temiz bir yol olduğunu umuyorum.

cevap

15

Delege veya blok kullanabilirsiniz;

id<SomeProtocol> delegate; 

ardından MainViewController en viewDidLoad böyle ayarlayın:

@protocol SomeProtocol <NSObject> 
- (void)someAction; 
@end 

Bunun gibi HomeViewController.h bir temsilci bildirmek: bir protokol oluşturma temsilci

kullanma

:

Eğer homeVC düğmeye bastığınızda

o zaman, sadece basitçe çağırır: Block kullanma

if ([self.delegate respondsToSelector:@selector(someAction)]) { 
    [self.delegate someAction]; 
} 

: o zaman

typedef void (^ActionBlock)(); 

@property (nonatomic, copy) ActionBlock block; 

:

HomeViewController.h bir blok mal beyanında MainViewController'da ViewDidLoad:

Eğer homeVC düğmeye bastığınızda

o zaman, sadece basitçe çağırır:

self.block(); 
+0

Tamam, bu yüzden UIViewController Sınırlama API gelen kaldıraç bir şey yok? – soleil

+0

Bu yazının size yardımcı olabileceğinden emin değilim [bunu kontrol et] (http://stackoverflow.com/questions/8379759/how-does-view-controller-containment-work-in-ios-5) –

+1

Ben +1 Yapabilirsem 3 kere. Sadece benim için aynı soruyu cevaplamadı ama blokları benim anlayışımı geliştirdi tenfold :) – Pedro

10

çok başka yolu var ... Her görünüm denetleyicisi yüzden ...

bu yapabileceği kullanarak parentViewController özelliğine sahiptir gerçekleştirmek istediğiniz eylem için bir yöntem tanımlamak MainViewController yılında

... HomeViewController yılında Sonra

- (void)someMethod:(BOOL)someParam; 

sen ...

MainViewController* parent = (MainViewController*)[self parentViewController]; 
[parent someMethod:paramValue]; 

hth :)

+2

Burada hızlı ve kirli bir şekilde iyi. Protokolü oluşturmak için biraz daha zamanınız varsa, seçilen cevabı kullanın. Teşekkürler pedro! –

3

yapabilirsiniz Bu çok yaygın bir kalıptır.Üst öğe, bir ve bir default extension sağlayarak eylemi gerçekleştirecek asıl örnek olacaktır.

Veli görünümü denetleyicisi:

protocol SomeProtocol { 
    func foo() 
} 

extension ParentViewController: SomeProtocol { 
    func foo() { 
     // Parent handles it 
    } 
} 

Çocuk görünümü denetleyicisi: Swift 3'te

@IBAction func tapGo(_ sender: Any) { 
    (parent as? SomeProtocol)?.foo() 
} 
+0

Çok teşekkür ederim, aradığım şey buydu :) – mic

İlgili konular