2011-08-21 3 views
-1

Я создаю приложение утилиты, которое делится данными между основным видом и флип-представлением. На самом деле, это не совсем флип-представление, которое хранит данные, это настраиваемый вид, который является экземпляром флип-представления при загрузке. Я объяснил особенности в своем предыдущем потоке here, но у меня пока нет решения. И я переработал свой код, надеюсь, на этот раз я мог бы прояснить ситуацию.Использование делегата для передачи данных между представлениями

Общая концепция здесь заключается в том, что я создаю и сохраняю данные в своем основном представлении и передаю их на вид с переворотом, используя предопределенный делегат в FlipViewController. Затем в FlipViewController я храню данные в своем собственном делетете и передаю его в пользовательское представление, которое реализует мой собственный метод делегирования. Ниже перечислены основные части кода.

MainViewController.m (только принимает <FlipsideViewControllerDelegate> протокол)

- (IBAction)showInfo:(id)sender {  

    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil]; 
    controller.delegate = self; 

    controller.chart = data; 

    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:controller animated:YES]; 

    [controller release]; 
} 

FlipsideViewController.h

@protocol FlipsideViewControllerDelegate; 
@protocol ChartDelegate; 

@interface FlipsideViewController : UIViewController { 
    id <FlipsideViewControllerDelegate> delegate; 
    id <ChartDelegate> delegate2; 
    DataModel *chart; 
} 

@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate; 
@property (nonatomic, assign) id <ChartDelegate> delegate2; 
@property (nonatomic, retain) DataModel *chart; 
- (IBAction)done:(id)sender; 
@end 


@protocol FlipsideViewControllerDelegate 
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller; 
@end 

@protocol ChartDelegate <NSObject> 
- (void)getParams:(DataModel *)dataModel; 
@end 

FlipsideViewController.m

@synthesize delegate, delegate2; 
@synthesize chart; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor]; 
     if ([delegate2 respondsToSelector:@selector(getParams:)]) { 
     [delegate2 getParams:chart]; 
    } 
} 

customDrawing.h

@interface customDrawing : UIView <ChartDelegate>{ 
    DataModel *chartData; 
} 
@property (nonatomic, retain) DataModel *chartData; 
@end 

customDrawing.m

@synthesize chartData; 
-(void)getParams:(DataModel *)dataModel{ 
     chartData = dataModel; 
} 

Оказывается, что данные не получить передается объекту chartData в моей настраиваемое представление. ПОМОГИТЕ?

+0

Почему не абстрактные модели из вашей точки зрения и имеют обе точки зрения наблюдения модель? Просмотров не должны хранить данные ... – Stephen

ответ

5

Вам не хватает оснований. Я не думаю, что вам нужны делегаты для выполнения этой задачи, но здесь мы идем.

Протокол, как договор. В вашем классе FlipsideViewController вы определили протокол, который, по существу, указывает, соответствует ли вам этот протокол, тогда вы должны реализовать этот метод.

Как вы соответствуете протоколу?

В MainViewController@interface будет выглядеть как этот

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> 

Тот факт, что вы протокол написан в угловых скобках означает, что вы обещаете соответствовать протоколу и, следовательно, должны реализовать

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller; 

в вашем MainViewController.m.

Теперь, когда MainNavigationController сам набор в качестве делегата (controller.delegate = self;), он заканчивает ссылку.Это позволяет FlipsideViewController называть

[delegate flipsideViewControllerDidFinish:self]; 

, который будет вызывать метод, определенный в MainViewController, который отклоняет модальный контроллер представления.

Вы определили второй протокол (вы могли бы добавить метод к первому, и тогда вы не должны принимать два протокола), а также другие указали вы не связаны классы вверх, делая

controller.delegate2 = self; 

Это не решит вашу проблему. Вам все равно нужно будет соответствовать ChartDelegate, добавив его в объявление. Как только вы это сделаете, вы все равно не выйдете из воды, потому что этот метод неверен.

Полное решение - не использовать делегатов, как они на самом деле не требуется здесь

MainViewController.h

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> 

- (IBAction)showInfo:(id)sender; 

@end 

MainViewController.m

@implementation MainViewController 

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (IBAction)showInfo:(id)sender 
{  
    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil]; 
    controller.delegate = self; 

    /* 
    * The labelText property is defined in the header for FlipsideViewController 
    * In this case this is the easiest way to get data from this controller to 
    * the controller we are about to display 
    */ 
    controller.labelText = @"WHAT EVER YOU WANT TO SEND"; // <---- sending data 

    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:controller animated:YES]; 

    [controller release]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

@end 

FlipsideViewController.h

@class FlipsideViewController; 

@protocol FlipsideViewControllerDelegate 
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller; 
@end 

@interface FlipsideViewController : UIViewController 


/* 
* These properties have been added. The label is used for displaying the text 
* and needs to be hooked up in Interface builder 
* 
* The NSString is the property that is holding the data passed from MainViewController 
*/ 
@property (nonatomic, retain) IBOutlet UILabel *testLabel; 
@property (nonatomic, copy) NSString *labelText; from MainViewControlller 

@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate; 

- (IBAction)done:(id)sender; 

@end 

FlipsideViewController.m

@implementation FlipsideViewController 

@synthesize delegate = _delegate; 

/* 
* We need to synthesise out properties so we get our getters and setters created 
*/ 
@synthesize testLabel = _testLabel; 
@synthesize labelText = _labelText; 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    /* 
    * This is called once the view is set up and all connections have been made in 
    * interface builder. Therefore we can now set the text of our test label 
    */ 
    self.testLabel.text = labelText; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

#pragma mark - Actions 

- (IBAction)done:(id)sender 
{ 
    [self.delegate flipsideViewControllerDidFinish:self]; 
} 

- (void)dealloc 
{ 
    /* 
    * Memory management for the ivars we added 
    */ 
    [_testLabel release]; 
    [_labelText release]; 
    [super dealloc]; 
} 

@end 
+0

Ваше решение, похоже, получает данные в flipsideview, как я уже говорил, это не то, что мне нужно делать. Мне нужно сделать собственный чертеж на подвью, который находится поверх флипсайдвью, используя данные, переданные из основного вида. Вот почему я передаю «диаграмму» делегату2 в методе viewDidLoad, как только загружается flipsideview. – Michael

+0

Спасибо! Я справился с этим. Я забыл создать экземпляр объекта в моем диспетчере flipsideview, теперь мне нужно передать данные непосредственно этому объекту subview. – Michael

0

У вас есть два свойства: delegate and delegate2. Вы назначаете значение делегировать, но позже вызываете метод на делегате2.

+0

Не могли бы вы сказать мне, как это исправить? Я действительно новичок в этом делетете ... – Michael

0

Вам необходимо назначить delegate2 (ваш класс customDrawing). Вы назначаете только delegate.

+0

Вы имеете в виду, мне нужен controller.delegate2 = self; в моем mainviewcontroller.m? Это означает, что я должен принять вместе с в mainviewcontroller? – Michael

+0

Вам нужно назначить любой класс 'delegate2', т. Е. Который содержит реализацию, которая обрабатывает методы . Возможно, главный контроллер просмотра - это хорошее место. – Mundi

+0

Я назначил делегат2 в методе своего класса customDrawing следующим образом: ChartDelegate * chartDelegate = [[ChartDelegate alloc] initWithNibName: @ "FlipsideView" bundle: nil]; chartDelegate.delegate2 = self; Но есть ошибка, говорит «ChartDelegate» незаявленной ... что я пропустил? Я проверил showInfo() в mainviewcontroller, он работает одинаково. – Michael

Смежные вопросы