2013-05-29 2 views
0

Получение сцепления с Obj-C, когда время идет хорошо, это хорошо!Может ли объект быть видимым в другом контроллере?

Итак, я буду использовать свой пример, с которого я пытаюсь научиться. Я использую контроллеры с вкладками. У меня есть UIButton на странице, которая приносит новый вид, как это:

FilterViewController *ctrl = [[FilterViewController alloc] init]; 

[UIView transitionFromView:self.view toView:ctrl.view duration:1 options:UIViewAnimationOptionTransitionCurlUp completion:nil]; 

self.filterViewController = ctrl; 

[self.navigationController pushViewController:self.filterViewController animated:NO]; 

Теперь, скажем, создать класс под названием TimeFilter и я инициализировать его в FirstViewController

TimeFilter *timeFilter = [[TimeFilter alloc] init]; 
[timeFilter saveTime:1300]; 

В FilterViewController может Я просто делаю это:

int timeSelected; 
timeSelected = [timeFilter getTime]; 

Я пытаюсь получить мою голову вокруг, как объекты работают в приложении, в отличие от инструмента командной строки.

Большое спасибо!

ответ

1

Просто определить свойство в FilterViewController:

@property (nonatomic, strong) timeFilter; 

Затем вы можете назначить timeFilter в контроллере представления в FilterViewController перед представлением его:

TimeFilter *myTimeFilter = [[TimeFilter alloc] init]; 
[myTimeFilter saveTime:1300]; 
FilterViewController *ctrl = [[FilterViewController alloc] init]; 
ctrl.timeFilter = myTimeFilter; 

Тогда внутри FilterViewController вы можете сделать:

int timeSelected = [self.timeFilter getTime]; 

И не используйте transitionFromView:toView:duration:options:completion:, чтобы показать новый контроллер. Правильный способ добиться того, что вы хотите:

ctrl.modalTransitionStyle = UIModalTransitionStylePartialCurl; 
[self presentViewController:ctrl animated:YES completion:nil]; 
+0

Эй , Прости! Это потеряло меня. Таким образом, getTime все еще определен в классе TimeFilter, например 'int theTime; - (int) getTime {return theTime; } ' –

+0

@JoshBoothe yes' getTime' определен в TimeFilter. Вам не нужно менять этот класс. Свойство похоже на указатель с автоматическими методами getter/setter и управления памятью. Вы в основном говорите классу FilterViewController, который использует экземпляр TimeFilter. –

+0

Думаю, я приближаюсь. Поэтому я создал класс TimeFilter, создав свойство в файле FirstViewController.h, у меня есть '# import'ed файл TimeFilter.h в .h и .m для FilterViewController, поэтому я предполагаю, что теперь мне нужно импортировать TimeFilter .h в моем FilterViewController (представление, которое появляется на экране), а затем выполните '[timeFilter setTime: 1];' и в FirstViewController он будет доступен через 'timeFilter.getTime', это правильно?Спасибо за ношение со мной –

2

Да и может делать такие вещи, и у вас на пути:

1) Вы можете сделать метод тех методов -класса, так, у не будет нужно создавать объекты.

+(id)getTime 

и вызывать его из любого места

[TimeFilter getTime]; 

2) Вы можете сделать TimeFilter синглтона

+(TimeFilter*)shared 
{ 
    static TimeFilter *kTimeFilter = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    kTimeFilter = [TimeFilter new]; 
}); 
    return kTimeFilter; 
} 

и в любом месте вашего кода вызова

[[TimeFilter shared] getTime]; 
+0

Эй, спасибо за это! В моей книге (Программирование в Objective-C, 5th edition) я еще не попал в одиночные игры, поэтому я попробую первый! Итак, если класс включен в начало файла, он будет доступен через метод класса во всех представлениях, это правильно? Итак, изменяя представления, данные остаются одинаковыми внутри класса/объекта? –

+0

отметьте ответ как принято, если это поможет. 1) Да 2) Не понял, что вы имеете в виду – alex

+0

Если вы создаете синглтон, вам нужно сделать его потокобезопасным через dispatch_once – d00dle

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