2013-12-17 19 views
12

Bu sorunun burada birçok kez sorulmuş ve yanıtlanmış olduğunu biliyorum. Ama bu şeyle ilk defa ilgileniyorum ve hala aklımda mükemmel bir uygulama yapamıyorum. İşte kod, SecondViewController'dan FirstViewController'a veri aktarmak için uyguladığım temsilci yöntemine sahibim.2 UIViewController arasında delege ve protokol kullanılarak veri aktarımı

FirstViewController.h

#import "SecondViewController.h" 

@interface FirstViewController : UITableViewController<sampleDelegate> 
@end 

FirstViewController.m

@interface FirstViewController() 

// Array in which I want to store the data I get back from SecondViewController. 
@property (nonatomic, copy) NSArray *sampleData; 
@end 

@implementation FirstViewController 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SecondViewController *controller = [[SecondViewController alloc] init];   
    [self.navigationController pushViewController:controller animated:YES]; 
} 
@end 

SecondViewController.h

@protocol sampleDelegate <NSObject> 
- (NSArray*)sendDataBackToFirstController; 
@end 

@interface SecondViewController : UITableViewController 
@property (nonatomic, strong) id <sampleDelegate> sampleDelegateObject; 
@end 

SecondViewController.m

@interface SecondViewController() 
@property (strong, nonatomic) NSArray *dataInSecondViewController; 
@end 

@implementation SecondViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.dataInSecondViewController = [NSArray arrayWithObjects:@"Object1", @"Object2", nil]; 
} 

- (NSArray*)sendDataBackToFirstController 
{ 
    return self.dataInSecondViewController; 
} 
@end 

Doğru mı yapıyorum? Tüm bu verileri self.dataInSecondViewController içinde FirstViewController'a göndermek ve ürününde saklamak istiyorum.

Bir şekilde FirstViewController ürününe erişemiyorum. sendDataBackToFirstController'a erişmek için uygulamakta kalacağım başka şeyler var mı?

+1

takip edin ikinci vc. Yani ikinci vc delegesi yönteminin ilk vc'de uygulanması gerekir. Ardından olay tetiklendiğinde ikinci vc yöntemini çağırın. Senaryonuzdan veri kaynağı veya temsilci almak isteyip istemediğinize dair belirsizdir. İlk vc için veri kaynağı olarak ikinci vc kullanırsanız, veri isteyen ilk vc'dir. Ama sadece ikinci vc'de bir olay gerçekleştiğinde, o zaman delege türünü ilk vc'ye geri döndürmek istiyorsunuz. Ardından, dönüş türünü geçersiz kılmak ve verileri argüman olarak iletmeniz gerekir. – Anupdas

+0

Doğru. İlk vc'imin didSelectRow ... 'da controller.delegate = self yapmayı denedim. Ancak bir şekilde denetleyici temsilci nesnesini bulamıyor. Kodum şu ana kadar doğru görünüyor mu? –

+0

@gdavis ve art'ın cevaplarını takip edin – Anupdas

cevap

8

Tam olarak doğru değil. Öncelikle ilk görüntü denetleyicide temsilci özelliğini atamanız gerekir, böylece ikinci görüntü denetleyicisi hangi nesnenin iletileceğini bilir.

FirstViewController.m

controller.delegate = self; 

İkincisi, gönderme ve geriye sizin temsilci yönteminin alma var. Birinci denetleyicinin, ikinci denetleyicide sendDataBackToFirstController'u çağırması beklenen bir şekilde ayarladınız. Temsilci deseninde, iletiyi gönderen ve isteğe bağlı olarak bu yöntemle veri gönderen SecondViewController'dır.Yani, böyle bir şey için temsilci beyanı değiştirmelisiniz:

// ... do a bunch of tasks ... 
// notify delegate 
if ([self.delegate respondsToSelector:@selector(secondControllerFinishedWithItems:)]) { 
    [self.delegate secondControllerFinishedWithItems:arrayOfNewData]; 
} 

I: En SecondViewController görevlerini bitirir ve temsilci bildirmek gerektiğinde

@protocol sampleDelegate <NSObject> 
- (void)secondControllerFinishedWithItems:(NSArray*)newData; 
@end 

Sonra, şöyle bir şey yapmalıyım Temsilcinin gerçekten göndermeden önce göndermek istediğimiz yönteme yanıt vereceğinden emin olmak için buraya bir ekstra ifade ekledik. Protokolümüzde isteğe bağlı yöntemlerimiz olsaydı ve buna sahip olmasaydık uygulama çöktü.

Bu yardımcı olur umarız!

+0

Sizin ve @ sanatın açıklamaları, protokol ve delegelerin tüm akışını anlamada bana çok yardımcı oldu. Delegeleri uygulamak için sanatın kodunu takip ettim ve istediğimi aldım. Devreye alma döngüsünü önlemek için delege özelliğini güçlü yerine zayıf olarak değiştirdim. –

1

İlk değişiklik @property (nonatomic, strong) id <sampleDelegate> sampleDelegateObject;@property (nonatomic, weak) id <sampleDelegate> sampleDelegateObject; için açıklama bu kelime ile çevrim arama google korumak önlemek için.

İkinci sizin protokol

@protocol sampleDelegate <NSObject> 
- (void)sendDataBackToFirstController:(NSArray*)dataToSendBack; 
@end 

olmalı ve göndermek istediğinizde verileri protokolde bu yöntemi uygulamalıdır [self.sampleDelegateObject sendDataBackToFirstControoler:yourData]; ilk görünüm denetleyicisi çağrı destekliyor.

4

Sen temsilci olarak ilk vc ayarlamanız gerekir bu

FirstViewController.h

#import "SecondViewController.h" 

    @interface FirstViewController : UITableViewController<sampleDelegate> 
    @end 

FirstViewController.m

@interface FirstViewController() 

    // Array in which I want to store the data I get back from SecondViewController. 
    @property (nonatomic, copy) NSArray *sampleData; 
    @end 

@implementation FirstViewController 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SecondViewController *controller = [[SecondViewController alloc] init]; 
    controller.sampleDelegateObject=self;  
    [self.navigationController pushViewController:controller animated:YES]; 

} 

    //implementation of delegate method 
    - (NSArray*)sendDataBackToFirstController 
{ 
    return self.dataInSecondViewController; 
} 
@end 

SecondViewController.h

@protocol sampleDelegate <NSObject> 
- (NSArray*)sendDataBackToFirstController; 
@end 

@interface SecondViewController : UITableViewController 
@property (nonatomic, strong) id <sampleDelegate> sampleDelegateObject; 
@end 
SecondViewController.m 

@interface SecondViewController() 
@property (strong, nonatomic) NSArray *dataInSecondViewController; 
@end 

@implementation SecondViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.dataInSecondViewController = [NSArray arrayWithObjects:@"Object1", @"Object2", nil]; 
    //calling the delegate method 
    [sampleDelegateObject sendDataBackToFirstController]; 
} 


    @end 
+1

protokolünün uygulanması, –

+0

'u uygulamak istediğiniz sınıfta olacaktır. Kod ile ayrıntılı bilgi için teşekkür ederiz. –

İlgili konular