передать данные из mainView в subview - PullRequest
1 голос
/ 21 августа 2011

Я создаю приложение на основе утилиты, данные хранятся в MainViewController, и теперь я знаю, как передать данные в FlipsideViewController (многие пожелания к этой теме Кстати, Отправка данных из Mainviewна обратную сторону? ).Но я получаю данные в подпредставление (подкласс UIView), которое я добавил к представлению обратной стороны.Как я могу передать данные в это подпредставление?Я видел, что в FlipsideViewController.h уже настроен делегат и протокол, я действительно новичок в вещах такого рода.Любая помощь будет принята с благодарностью!


Обновления:

На главном экране у меня есть пара текстовых полей для ввода пользователями для создания объекта.Все объекты хранятся в массиве.А именно, мои данные создаются и хранятся в MainViewController.Теперь, с другой стороны, у меня есть собственный подкласс UIView, который позволяет мне делать мой собственный рисунок на основе данных в этом массиве.Здесь мне нужно передать данные, хранящиеся в MainViewController, в это подпредставление.Вот мой соответствующий код:

В MainViewController.m

- (IBAction)showInfo:(id)sender {    

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

    controller.receiver = data;//this is what I've done.

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

    [controller release];
}

В FlipsideViewController.h

@protocol FlipsideViewControllerDelegate;

@interface FlipsideViewController : UIViewController {
    id <FlipsideViewControllerDelegate> delegate;
    DataModel *receiver; //create a property to receive the data transferred from main view
}

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


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

В приведенном выше коде «данные» представляют собойОбъект DataModel объявлен в файле MainViewController.h.

И я хочу сделать свой собственный чертеж в классе drawing (подкласс UIView), как я могу передать данные из FlipsideViewController в это подпредставление?Нужно ли использовать делегата, объявленного в файле FlipsideViewController.h?Заранее спасибо!

Ответы [ 2 ]

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

Я быстро взглянул на шаблон и думаю, что вы путаетесь с тем, для чего используется делегат.

Делегат в этом шаблоне не передает данные.Когда вы нажмете кнопку «Готово», она перезвонит на MainViewController и попросит вызвать метод dismissModalViewControllerAnimated, чтобы он мог удалить контроллер представления.Это кажется немного излишним, так как документация гласит:

If you call this method on the modal view controller itself, however, the modal view controller automatically forwards the message to its parent view controller.

. Поэтому вам не нужно вызывать родителя, чтобы сделать это.

В Интерфейсном конструкторе вы можете видеть, что FlipsideView.xibимеет File's Owner значение FlipsideViewController.xib.

enter image description here

Теперь, если вы щелкните правой кнопкой мыши File's Owner, вы увидите, что view подключен к View, это в основном означает, что view является именем свойствав FlipsideViewController и View это элемент в Интерфейсном Разработчике.

enter image description here

Поэтому мы можем получить доступ к элементам в файле xib из FlipsideViewController, используя выходы.

Чтобы нарисовать метку, вам нужно сделать пару вещей

Сначала добавить свойство в .h и синтезировать его в .m как

// FlipsideViewController.h
@interface FlipsideViewController : UIViewController

@property (nonatomic, retain) IBOutlet UILabel *testLabel; // <----- Added this
@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;

- (IBAction)done:(id)sender;

@end

// FlipsideViewController.m
@implementation FlipsideViewController

@synthesize delegate = _delegate;
@synthesize testLabel = _testLabel; // <----- Added this

// More methods

- (void)dealloc
{
   [_testLabel release];  // Always do you memory management
   [super dealloc];
}

Затем вернуться вInterface Builder

  1. Добавьте элемент UILabel к вашему виду
  2. ctrl + drag из File's Owner в UILabel, который вы добавили
  3. Выберите метку вмой пример это testLabel

Теперь они правильно подключены.Место, где вы хотите установить значение метки, находится в viewDidLoad:, что вы можете теперь сделать следующим образом:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.testLabel.text = @"It Works";  // You would use the data passed in from `MainViewController`
}
0 голосов
/ 21 августа 2011

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

Например;

В вашем FlipsideViewController.h объявите «контейнер» для данных, которые вы хотите передать. Для правильной работы должен быть один класс с обеих сторон, т.е. NSArray для NSArray, NSMutableDictionary для NSMutableDictionary.

NSMutableArray *newData;
...
@property (nonatomic, retain) NSMutableArray *newData; // This allows you to access this object from outside this class.

и в FlipsideViewController.m

@synthesize newData;
...
[newData release];

Теперь нам нужно передать данные, так сказать. Допустим, данные, которые мы хотим «отправить», хранятся в NSMutableArray с именем «results».

В нашем MainViewController.m, когда мы создаем наш следующий контроллер представления (в данном случае FlipsideViewController), мы можем напрямую ссылаться на изменяемый массив newData после инициализации пера.

FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
controller.newData = results;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release];

Убедитесь, что вы импортируете свой FlipsideViewController в свой файл MainViewController.h.

Если свойство объявлено в вашем .h файле, вы можете в значительной степени ссылаться на содержимое объекта из любой точки стека представлений!

Надеюсь, это поможет: D

...