Soru iOS 6 - bir segue gevşettiğimde veriyi geri verebilir miyim?


Storyboard araçlarını kullanarak basit bir gevşetme seferi oluşturdum. Gevşemek istediğim görünümde aşağıdaki olay işleyicisini oluşturdum:

-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
    NSLog(@"SEGUE unwind");
}

Bu doğru bir şekilde ateş eder ve segue'yi açar (mesaj günlüğe kaydedilir).

Kullanıcı sınavdan çıktığında, bazı verileri geri aktarmak ve bunun nasıl gerçekleştirileceğiyle mücadele etmek istiyorum. Birisi tavsiye edebilir mi?


25
2017-10-23 20:22


Menşei


Merhaba, bunu çözdün mü? Ben de çözümü arıyorum. Tq - dan
Jeff'in cevabı olduğu çözüm. YourViewController *yourVC = [segue sourceViewController]; Çözme yönteminizin içinde ve ardından VC nesnesindeki çıkışlarınıza / alanlarınıza erişebilirsiniz. - Voicu
Çalışır ve her şey, ama bir çözme işleyicisi için tek mekanizmanın (hedef) utanç verici UIViewControllergevşetici başlatıcıdan bilgi almak için) UIViewController Bu çözülüyor. Eğer hoş olurdu UIStoryboardSegue ayrıca bilmek için bir yol sağladı sender Bu gevşemeyi başlattı. Birçok durumda bunun, çözme işleyicisine bilgi vermenin daha iyi bir yolu olabileceğini düşünüyorum. - Benjohn


Cevaplar:


Teşekkürler Jeff. İzledikten sonra WWDC videosu 407 Açık bir çözümüm var.

Görünüm denetleyicide, gevşemenin hedefi olan tek bir UIStoryboardSegue parametresi alan ve bir IBAction döndüren bir yöntem oluşturmanız gerekir. UIStoryboardSegue, kaynak görünümü denetleyicisini döndürmek için bir yönteme sahip! İşte videodan alınan örnek (Apple'dan kredi).

- (IBAction)done:(UIStoryboardSegue *)segue {
    ConfirmationViewController *cc = [segue sourceViewController];
    [self setAccountInfo:[cc accountInfo]];
    [self setShowingSuccessView:YES];
}

35
2017-10-28 09:21



Güzel kod, sadece açıklığa kavuşturmak için: ConfirmationViewController, çözdüğümüz görüntü denetleyicisidir ve bu yöntem, denetlemek istediğimiz denetleyicide bulunur. - fullMoon
Referans olarak, yukarıda bahsedilen WWDC videosunun bir bağlantısıdır. İlgili kısım 37 dakika civarında başlar: developer.apple.com/videos/play/wwdc2012-407 - Oz Solomon


Bu elma konuşmasında, ikinci yarısında, bir hoşnutsuzluktan geri veri almak çok güzel bir şekilde açıklanmıştır. sunum (düzenleme: 37:20'den başlar)

Özellikle, bir seğirme sırasında [segue sourceViewController], gevşeme olayının kaynaklandığı hala aktif görüntü denetleyicisidir, bu nedenle özelliklerinizi her zamanki gibi girin.


11
2017-10-26 15:50





Denetleyicinin kapatılmakta olan functionForSeque işlevini ekleyin.

-(geçersiz)prepareForSegue: (UIStoryboardSegue *) segue göndereni: (id)gönderen

Bu işlev çağrılır önce gevşemek


5
2017-12-31 11:31





Bir temsilci kurun ve sınavdan çıkma ve verileri geri gönderme hakkında kaynak görüntüleme denetleyicinizi bilgilendirin. Kaynak görünümü denetleyicisini hedef görüntü denetleyicisinin temsilcisi olarak ayarlamayı unutmayın.

// DestinationViewController.h
@protocol DestingationDelegate;
@interface 
...
@property (assign) id<DestinationDelegate> delegate;
...
@end

@protocol DestinationDelegate
-(void)didQuitQuiz:(NSDictionary*)infoDict;
@end

// DestinationViewController.m
-(IBAction)quitQuiz:(UIStoryboardSegue *)segue {
  NSLog(@"SEGUE unwind");
  if (self.delegate) [self.delegate didQuitQuiz:infoDict];
}


// SourceViewController.h
#import DestinationViewController.h
@interface SourceViewController : ViewController <DestinationDelegate>
....

// SourceViewController.m
-(void)didQuitQuiz:(NSDictionary *)infoDict {
    if (infoDict) {
       // do something with the data
    }
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   ...
   destinationViewController.delegate = self;
}

1
2017-10-23 20:32



Protokoller harika, ancak iOS6, posterlerin sorduğu şeyleri istemekle hayatı kolaylaştırıyor. - Jeff


Evet,
Bunun için, verilerinizin başka bir görüntü denetleyiciden gönderilmesini sağlayan özellikler oluşturmanız gerekir:

    - (IBAction)unwindSelectFriendsVC:(UIStoryboardSegue *)segue
    {
        if ([segue.sourceViewController isKindOfClass:[ChildVC class]]) {

            ChildVC *child = (ChildVC *) segue.sourceViewController;

            //here we are passing array of selected friends by arrSelectedFriends property
            self.arrFriendList = child.arrSelectedFriends;
            [self.tableView reloadData];
        }
    }

1
2017-07-02 12:36





Görünüm denetleyicileri arasında veri aktarımı genellikle protokoller kullanılarak gerçekleştirilir. İşte bir örnek:

Test denetleyici başlığınızda, benzer bir protokol tanımı bildirin:

@protocol JBQuizViewControllerDelegate <NSObject>

@required
- (void)quizController:(id)controller didQuitWithState:(NSString *)state;

@end

Sunum görüş kontrolcünüzde prepareForSeque: yöntem, temsilci bağlayın:

JBQuizViewController *destination = (JBQuizViewController *)segue.destinationViewController;
destination.delegate = self;

Ardından, sunma görünüm denetleyicinizde, temsilci protokolünü işleyin. quizController:didQuitWithState: yöntem.

Son olarak, kullanıcı testinizi bıraktıktan sonra, protokolü kullanarak, eyalette geçen veya ifşa etmek istediğiniz herhangi bir veriyi kullanarak delege bildirmeniz gerekir.


0
2017-10-23 20:31