Görünüm arasında geçen Veri Denetleyicileri
İOS ve Objective-C ve tüm MVC paradigma yeniyim ve aşağıdaki saplanıp kaldım.
Veri giriş formu gibi davranan bir görünümü var ve kullanıcı birden fazla ürün seçmek için Seçenek vermek istiyorum. Ürünler tableview bir denetleyicisi ile başka bir görünüme listelenir ve çoklu seçim sağlamıştır.
Benim soru, nasıl bir görünüm verileri aktarabilirim? Ben çok özledim seçimleri üzerinde tableview bir dizi, ama nasıl o zaman geçmesi için geri önceki veri giriş formu görünümü çok olabilir kaydedilmiş ile birlikte veri için temel veri gönderme şeklinde mi?
Sörf etrafında ve bazı insanlar app temsilci bir dizi ilan gördüm. Tek bir şey duymuştum ama bu Bilgi bir model oluşturma hakkında bir şeyler okudum ne anlamıyorum.
Bu sahne doğru yolu ne olurdu ve nasıl bu konuda gitmek istiyorsunuz?
CEVAP
Bu soruya daha iyi bir cevap insanlar benim gibi iOS dünyasında başlayan yardım ver dedim çok popüler burada stackoverflow gibi görünüyor.
Bu cevap insanları anlamak için yeterince açık ve hiçbir şey kaçırmadım umarım.
Geçen Veri İlet
Geçen başka bir veri görünümü denetleyicisi görünümü denetleyicisi için ileri. Eğer bir gezinti yığını için bastırıyor olabilir başka bir görünüm denetleyicisi bir görünüm denetleyicisi nesnesi/bir değer vermek istediğinizde bu yöntemi kullanabilirsiniz.
Bu örnek için ViewControllerA
ViewControllerB
olacak
ViewControllerB
ViewControllerA
BOOL
bir değer geçirmek için aşağıdakileri yapın.
ViewControllerB.h
BOOL
için bir özellik oluşturun@property(nonatomic) BOOL *isSomethingEnabled;
ViewControllerA
ViewControllerB
bu yüzden kullanımı hakkında söylemek gerekir#import "ViewControllerB.h"
Nereye görünüm eg yüklemek istiyorum.
didSelectRowAtIndex
veya nav üzerine basmak önceViewControllerB
özelliği ayarlamanız gerekirIBAction
bazı yığını.ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.isSomethingEnabled = YES; [self pushViewController:viewControllerB animated:YES];
Bu
BOOL
değerYES
30isSomethingEnabled
koyacaktır.
Geçen Veri İleriye Geçiş kullanarak
Eğer Çizimlerini kullanıyorsanız geçişlerini kullanarak çok büyük olduğunu ve verileri öne geçmek için bu işlem gerekir. Bu yukarıdaki benzer ama görünüm denetleyicisi basmak önce verileri geçirmeden yerine, adında bir yöntem kullanırsınız
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
ViewControllerA
BOOL
36 ** geçmek için şunları yapın:
ViewControllerB.h
oluşturmakBOOL
bir özellik@property(nonatomic) BOOL *isSomethingEnabled;
ViewControllerA
ViewControllerB
çok kullanımı hakkında söylemek gerekir#import "ViewControllerB.h"
Film şeridinde
ViewControllerB
43 *segue bir oluşturmak ve bir tanımlayıcı ver, bu örnekte"showDetailSegue"
arayacağızHerhangi bir zaman, bu nedenle yapıldığında denir
ViewControllerA
yöntemi eklemeliyiz sonraki geçiş olarak adlandırılan tespit etmeliyiz ve bir şeyler yapın. Bizim örneğimizde"showDetailSegue"
kontrol edeceğiz ve eğer thats işlemiViewControllerB
48 *bizim değer geçeceğiz-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"showDetailSegue"]){ ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController; controller.isSomethingEnabled = YES; } }
Eğer manzaralı bir gezinti denetleyicisi gömülü varsa yöntemi aşağıdaki gibi yukarıda biraz değiştirmek gerekir
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"showDetailSegue"]){ UINavigationController *navController = (UINavigationController *)segue.destinationViewController; ViewControllerB *controller = (ViewControllerB *)navController.topViewController; controller.isSomethingEnabled = YES; } }
Bu
BOOL
değerYES
53isSomethingEnabled
koyacaktır.
Geçen Veri Geri
Veri ViewControllerA
56 *pas için geri kullanmanız gerekebilirProtokol ve DelegeleryaEngellerikincisi geri aramaları için gevşek bir mekanizma olarak kullanılabilir.
Bunu yapmak için ViewControllerA
ViewControllerB
bir temsilci yapacak. Bu ViewControllerB
mesaj ViewControllerA
bize geri verileri geri göndermek için sağlayan göndermek için izin verir.
ViewControllerA
64**uygun olmalı ViewControllerB
temsilci'belirtmek için var olan s kuralı. olmak için Bunu uygulamak gerekir ViewControllerA
söyler.
#import
ama yukarıdaki@interface
aşağıdaViewControllerB.h
, seni protokolü belirtin.@class ViewControllerB; @protocol ViewControllerBDelegate <NSObject> - (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item; @end
sonraki
ViewControllerB.h
haladelegate
bir özellik kur veViewControllerB.m
sentezlemek gerekir@property (nonatomic, weak) id <ViewControllerBDelegate> delegate;
ViewControllerB
görünüm denetleyicisi biz popdelegate
mesaj diyoruz.NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack];
ViewControllerB
için.ViewControllerA.h
şimdi ** 79ViewControllerB
ithalat ve Protokole uygun söyle.#import "ViewControllerB.h" @interface ViewControllerA : UIViewController <ViewControllerBDelegate>
Bizim protokolü
ViewControllerA.m
aşağıdaki yöntemi uygulayın- (void)addItemViewController:(ViewControllerB *)controller didFinishEnteringItem:(NSString *)item { NSLog(@"This was returned from ViewControllerB %@",item); }
Yapmamız gereken son şey
ViewControllerA
ViewControllerB
iteriz önce temsilci nav yığını üzerindeViewControllerB
söyle.ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; viewControllerB.delegate = self [[self navigationController] pushViewController:viewControllerB animated:YES];
Referanslar
- Using Delegation to Communicate With Other View ControllersGörünüm Denetleyicisi Programlama Kılavuzu
- Delegate Pattern
Açısal JS denetleyicileri arasında geç...
Ne'in iletişim kurmak için en iyi...
Açısal: denetleyicileri arasında veri ...
Geçen bir parçası ve konteyner faaliye...
Nasıl parçaları arasında veri aktarmak...