Передача данных в и из представлений в Objective-C - PullRequest
0 голосов
/ 06 ноября 2011

Мне нужно передать данные между различными представлениями в моем приложении.Различные представления используются для установки свойств класса, который используется во всем приложении.

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

См. ниже мой псевдокод:

  • У меня есть класс 'Car',со свойствами: carColor, carEngineSize, carFuelType ...
  • MainView в приложении отображает класс Car и использует его методы.Это представление, с которым взаимодействуют конечные пользователи.
  • CarSettingsView, доступный из MainClass (PopOverFromBarButtonItem :) открывает всплывающее окно настроек, которое позволяет пользователю изменять свойства класса Car с использованием различных UITableLayouts

Класс автомобиля:

@interface Car : NSObject
{
    id delegate;        
    NSString *carModel;   
    NSString *carColor;    
    BOOL turboCharged;       
    int carEngineSize;     
    NSString *carFuelType;  
}

@property [...]

MainView реализует класс myCar , который используется в приложении.

CarSettingsView:

Реализация dummyCar Car.

@class Car;

@interface SettingsPopOver : UITableViewController <UIPopoverControllerDelegate>
{
    NSMutableArray *tableContentsArray;
    UINavigationController *navigationController;
    SetParametersView *paramView;
    Car *dummyCar;
} 

При вызове CarSettingsView из MainView я передаю myCar :

- (IBAction)btnSettings:(id)sender {


    settings = [[SettingsPopOver alloc]init];

    [settings setDummyCar:myCar]; //Pass over myCar from the MainView 

    UIPopoverController *aPopOver = [[UIPopoverController alloc]initWithContentViewController:settings];


    //self->popOverController = aPopOver;
    popOverController = aPopOver;
    popOverController.delegate = self;

    [popOverController setPopoverContentSize:CGSizeMake(300, 400)];
    [popOverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];


}

Затем я выполняю любые изменения свойств непосредственно на dummyCar в представлении настроек, затем копирую dummyCar обратно в myCar при закрытии представления настроек:

-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
  myCar = [settings dummyCar];
}

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

Рад слышать комментарии по этому поводу и / или онлайн-ссылки, которые укажут мне правильное направление.

Ответы [ 2 ]

1 голос
/ 06 ноября 2011

Я не прочитал весь ваш вопрос. «Но я не уверен, что это правильный путь, также он становится немного неуклюжим, когда несколько представлений настроек вложены, и объект должен быть передан вниз по нескольким слоям, а затем обратно в главное представление, где находится исходный объект». Похоже, вы хотите разделить значение между несколькими контроллерами представления или несколькими классами ... тогда Singletons - это путь. http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html эта статья, написанная Мэттом Галлахером, объясняет это.

0 голосов
/ 06 ноября 2011

Получение свойства dummyCar для контроллера настроек в конце не очень хорошая идея.Но два хороших способа выполнения очень близки к тому, что вы делаете:

Идея 1 - Сделать dummyCar свойством «назначать» или «сохранять».Таким образом, вы сможете изменять свойства автомобильного объекта непосредственно из контроллера настроек.Нет необходимости делать это в главном представлении вызывающего абонента в конце.

Это приведет к тому, что вы будете делать то же самое, что и при настройке настроек iDevice: не нужно просить пользователя сохранить,Любые изменения принимаются во внимание.

@property(nonatomic, retain) Car *dummyCar;  // .h
@syntesize dummyCar;  // .m

Идея 2 - Сделать dummyCar как свойство "copy" (лучше всего).Таким образом, оригинальная машина не изменяется вашими изменениями.Сделайте то, что вам нужно, и в методе, который вы вызываете у основного абонента во время увольнения, передайте объект модифицированного автомобиля, который вы хотите заменить исходным автомобилем.Затем сделайте это замените.

@property(nonatomic, copy) Car *dummyCar;  // .h
@syntesize dummyCar;  // .m

Реализация протокола NSCopying моего автомобиля

@interface Car : NSObject <NSCopying>  // .h
Implement copyWithZone // .m

и

// Protocol method on main caller called by settings controller at dismissal time
-(void)popoverControllerDidDismissPopoverWithNewCar:(Car*)modifiedCar  
{
  self.myCar = modifiedCar;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...