Использование делегата для передачи данных между представлениями - PullRequest
0 голосов
/ 21 августа 2011

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

Общая концепция здесь - я создаю и сохраняю данные в моем главном представлении и передаю их в виде бокового вида с использованием предопределенного делегата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 в моемпользовательский вид.HELP

Ответы [ 3 ]

5 голосов
/ 21 августа 2011

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

Протокол похож на контракт. В вашем классе 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 голосов
/ 21 августа 2011

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

0 голосов
/ 21 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...