Как получить доступ к данным из одного представления в другое? - PullRequest
1 голос
/ 09 июня 2010

У меня есть UITabBarController с двумя вкладками:

  1. UINavigationController
  2. OptionsViewController : UIViewController

Как я могу получить данные (т.е.. UILabel.text) устанавливается в OptionsViewController, в новом добавленном модальном виде, который был вызван из UINavigationController?

Edit1:

Сценарий: после запускаПриложение Я выбираю вторую панель вкладок под названием «Параметры», где я заполняю текстовое поле.Для метки установлено значение от textField .Далее я выбираю первую вкладку под названием «Главная», где у меня есть кнопка.Я нажимаю на кнопку, и появляется новый модальный вид.В этом новом модальном виде я хотел бы показать значение из textField

Ответы [ 4 ]

2 голосов
/ 10 июня 2010

Я люблю MVC, но я не абсолютный пурист до такой степени, что причиняю себе боль при выполнении довольно тривиальной задачи, поэтому ответы, которые вы получили здесь, хорошие и полезные. Однако, создавая ivar для ссылки на определенный тип, такой как метка или другой контроллер представления, вы объединяете вещи, которые не нужно соединять. Вместо этого вы можете сделать свой первый контроллер представления вкладок делегатом вашего второго контроллера представления вкладок. Так что сделайте что-то подобное в вашем делегате приложения.

OptionsViewController *optionsViewController = // ... get this from the tab view
FirsTabViewController *firstTabViewController = // ... same here

[optionsViewController setDelegate:firsTabViewController];

Это означает, что вам нужен ивар в вашем OptionsViewController:

@property (assign) id delegate;

Затем, когда любое событие, которое вы хотите вызвать, происходит в вашем контроллере представления параметров, посмотрите, может ли делегат ответить на селектор, который вы назвали. Например:

- (void)someEventHappenedLikeTyping:(id)sender;
{
    if ([delegate respondsToSelector:@selector(setOptionsString:)]
        [delegate performSelector:@selector(setOptionsString:) withObject:[label text]];
}

Обратите внимание, что вы никогда не указывали какие-либо конкретные типы объектов. Вы просто проверяете, может ли делегат (который был объявлен как id) ответить на этот селектор. Если это возможно, он делает то, что ему говорят, и просто молчит в противном случае.

Чтобы это работало, вам нужен ivar для optionsString в вашем FirstTabViewController, и поэтому он будет объявлен в заголовке как:

@property (copy) NSString *optionsString;

и затем @synthesize в .m. Это приводит к тому, что -setOptionsString становится допустимым селектором, который будет вызываться в методе -someEventHappenedLikeTyping.

Во всяком случае, теперь, если вам когда-нибудь понадобится изменить какой вид контроллера ссылается на какой, вам не нужно заходить в заголовок и изменять тип ссылочной таблицы ivar. Вам просто нужно внедрить селектор (кстати, это неформальный протокол) в контроллере представления, который является делегатом вашего контроллера представления параметров.

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

С уважением,

p.s. Иногда необходимость обмена данными между двумя контроллерами панели вкладок означает, что у вас есть недостаток дизайна. Если вы хотите сохранить настройки в окне параметров, просто позвоните

[[NSUserDefaults standardUserDefaults] setObject:[label text] forKey:@"option1"];
[[NSUserDefaults standardUserDefaults] synchronize];

Затем вы можете вытащить NSUserDefaults обратно на главную вкладку с помощью

NSString *option1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"option1"];
// Do something with option1
1 голос
/ 09 июня 2010

В вашем OptionsViewController создайте свойство:

@property (nonatomic, retain) UILabel *mylabel;

затем после создания OptionsViewController, но перед его отображением установите свойство mylabel. (Или, возможно, вы просто хотите текст, чтобы вы могли использовать свойство NSString*.)

Edit:

Так что вы, вероятно, хотите сделать что-то вроде этого:

OptionsViewController *vc = [[OptionsViewController alloc] init];
vc.mylabel = mySomethingLabel;
[self presentModalViewController:vc animated:YES];

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

0 голосов
/ 19 января 2011

У меня есть простой способ доступа к данным между представлениями. Давай попробуем. У вас есть два представления с именами view1 и view2, вы можете определить свойство View * vc1 в view2.h, установить точку vc1 равной view1, когда выскочит view2, например:

view1.m

//here pop out view1 code
    View2 *view2 = [[View2 alloc] initWithNibName:@"View2" bundle:[NSBundle mainBundle]];
    [self.navigationController pushViewController:view2 animated:YES];
    view2.vc1 = self;  //transfer view1 instance to view2,use vc1 you may handle view1 in view2 directly
        [view2 release];

view2.h

    #import "view1.h"
    @property (nonatomic, retain) IBOutlet View1 *vc1; //here you could name it as view1 as well :)

view2.m

    vc1.lblTable.text = @"ok"; //you'll see "ok" in view1
    [self.navigationController popViewControllerAnimated:YES]; //navigate to view1

// не забудьте выпустить vc1

0 голосов
/ 10 июня 2010

Я обычно устанавливаю IBOutlets в каждом из моих контроллеров представления, которые указывают на другой контроллер.Поэтому, если бы у меня были контроллеры представления A и B. A имеет IBOutlet для B и B для A. Тогда, когда я хочу получить доступ к чему-либо в B из A, я просто использую оператор точки на B.

В вашем примереUINavigationController будет #include "OptionsViewController.h" и будет иметь ivar IBOutlet OptionsViewController * ovc (который установлен в IB), а затем любая переменная экземпляра из вашего контроллера представления опций может ссылаться как ovc.UILabel.text из контроллера навигации.Этот процесс можно изменить, чтобы получить доступ к значениям из контроллера навигации в контроллере представления параметров.

Пример контроллера навигации (.h):

#include "OptionsViewController.h"
@interface UINavigationController // (whatever the name of this class is)
{
OptionsViewController * ovc;
}
@property (nonatomic, retain) IBOutlet OptionsViewController * ovc;
@end

Пример OptionsViewController.h:

@interface OptionsViewController 
{
UILabel * label;
}
@property (nonatomic, retain) IBOutlet UILabel * label;
@end

Затем из UINavigationController (.m) вы можете просто написать ovc.label.text для доступа к тексту.

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