6

Amaç: ben daha önce ve hemen ben sadece yeni bilgilerle görevden aynı viewController mevcut sunumunu yaptılar modalView görevden istiyorum.iOS: reddeden ve Ana ViewController erişimi olmayan ModalViewController sunan

Sorun: Ben modally ilk ViewController sunulan ebeveyn ViewController için açık pointer olmadan bunu yaparken de çok başarılı olmamıştır. Önceki viewController'un kodu ile uğraşmadan çalışan bu sınıfı yazmaya çalışıyorum.

Olası kurşun: Ben deneyler yapıyorlar şeylerin çift vardır: şu anda nasıl bilmiyorum ebeveyn ViewController, erişmek için çalışıyorum)

1.. Bu ebeveyn viewController erişim hakkı çalışması gerekir Teoride

UIViewController* toPresentViewController = [[UIViewController alloc] init]; 
    [self dismissViewControllerAnimated:YES completion:^{ 
     [parentViewControllerAccessor presentModalViewController:toPresentViewController animated:YES]; 
}]; 

:

2.) ebeveyne erişim kazanmış sonra, ben sadece aşağıdaki kodu uygulayabilirsiniz. Bunu yapmanın başka yollarına açığım.

Varsayım: Bunu, üst ViewController herhangi bir kod değiştirme yetkiniz yok.

cevap

11

Kodunuz görünüyor bunu görevden istediğinizde

Örneğin, kalıcı bir görünüm dışından bu bildirimi yangın Çalışması gerektiği gibi. IOS 5 kullanıyorsanız, presentingViewController adı verilen UIViewController özelliği vardır.

@property(nonatomic, readonly) UIViewController *presentingViewController; 

Bu özelliği, modal denetleyicinizi sunan görünüm denetleyicisini almak için bu özelliği kullanabilirsiniz.

Not: Eğer ilk erişime hangi özelliği karar OS sürümünü kontrol etmek zorunda kalacak destekleyen hem iOS 4 ve 5 ise böylece iOS 4 parentViewController yılında başvuru denetleyiciye ayarlanmış olması. parentViewController şimdi sadece içerdiği görünüm denetleyicilerin ebeveyn için kullanılır böylece iOS 5'te Apple bu sabit (UIViewController belgelerinde bir Konteyner View Controller uygulanması bölümüne bakınız). blok içinden self.presentingViewController erişmek ilişkin:

düzenleme (modal görünümü denetleyicisi görevden sonra) blok olarak adlandırılır zaman presentingViewController özelliği nil ayarlanmış alınabilir. Bloğun içinde self.presentingViewController öğesinin, oluşturulduğunda değil, blok yürütüldüğünde mülkün değerini verdiğini unutmayın.Buna karşı korumak için aşağıdakileri yapın: bu gereklidir

UIViewController* toPresentViewController = [[UIViewController alloc] init]; 
UIViewController* presentingViewController = self.presentingViewController; 
[self dismissViewControllerAnimated:YES completion:^ 
{ 
    [presentingViewController presentModalViewController:toPresentViewController animated:YES]; 
}]; 

self gitti çünkü artık sunulmuştur çünkü değil/(güvenle bloğu tarafından korunur) görevden ancak, bu nedenle onun presentingViewController şimdi sıfırdır. presentingViewController'u başka bir yerde depolamak gerekli değildir, yerel değişken iyidir, çünkü blok tarafından korunacaktır.

+0

Bunu doğru anlıyorsam, şu kodu değiştirmeliyim: '[parentViewControllerAccessor presentModalViewController: toPresentViewController animasyonlu: YES];' '' [self.presentingViewController presentModalViewController: kırpılmışPhotoVC canlandırıldı: EVET]; '. Ne yazık ki, bu işe yaramıyor. Yanlış bir şey mi anladım? – Byte

+1

Bu, büyük olasılıkla blokların nesneleri nasıl tuttuklarından kaynaklanır - kendini koruyacaktır, ancak görüntüleme denetleyicisini değil, bu nedenle "ben" inin reddedilmesiyle bu özellik sıfırlanmayabilir. Self.presentingViewController öğesini, bloğun dışındaki bir yerel değişkene ayarlayın ve ardından bu değişkeni blok içinden kullanın. – jhabbott

+0

Bu aynı sonuca vardım. Bunu yapmak için statik bir değişken yapmalıyım ki, kendiliğinden kaldırıldığında, yöntem hala çalışmaya devam edecektir. Ama bu daha çok bir kesmek gibi görünüyor. – Byte

1

bildirimleri kullanarak bunu başarabilir.

[[NSNotificationCenter defaultCenter] postNotificationName:@"dismissModalView" 
                object:nil 
                userInfo:nil]; 

Ve sonra kalıcı bir görünüm içinde ki bildirim işlemek:

- (void)viewDidLoad { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(dismissMe:) 
               name:@"dismissModalView" 
               object:nil]; 
} 

- (void)dismissMe:(NSNotification)notification { 
    // dismiss it here. 
} 
+0

Bu demek şimdi ne olduğundan emin değilim, açıkça belirtti, bu viewController sunan önceki viewController koduna dokunamıyorum. Buradaki bir şeyi yanlış anlamadığım sürece? – Byte

1

iOS5 için çözüm:

-(void)didDismissModalView:(id)sender { 

    // Dismiss the modal view controller 
    int sold=0; 

    if(sold==0){ 

     //Cash_sold.delegate = self; 
     // Cash_sold.user_amount.text=[NSString stringWithFormat:@"%d",somme]; 

     Cash_sold = [[CashSoldview alloc] initWithNibName:@"CashSoldview" bundle:nil]; 
     CGRect fram1 = CGRectMake(200,20,400,400); 
     Cash_sold.view.superview.frame = fram1; 
     Cash_sold.view.frame=fram1; 
     Cash_sold.modalTransitionStyle= UIModalTransitionStyleCoverVertical; 
     Cash_sold.modalPresentationStyle=UIModalPresentationFormSheet; 

     UIViewController* presentingViewController = self.parentViewController; 

     [self dismissViewControllerAnimated:YES completion:^ 
     { 
     [presentingViewController presentModalViewController:Cash_sold animated:YES]; 
     }];  
    } 
} 
1

aşağıdaki kodu deneyin: "Lütfen kalıcı bir görünüm içinde ki bildirim işlemek ardından Ve:"

[self dismissViewControllerAnimated:NO 
         completion:^{ 
    // instantiate and initialize the new controller 
    MyViewController *newViewController = [[MyViewController alloc] init]; 
    [[self presentingViewController] presentViewController:newViewController 
               animated:NO 
               completion:nil]; 
}]; 
+0

çok kısa kod ve iyi çalışıyor .. – svmrajesh