Передача переменных в цель C - PullRequest
0 голосов
/ 16 июня 2009

Обычно я передаю переменную в методах init, но на этот раз я не могу этого сделать, потому что у меня есть переменная в одном классе ViewController, отображаемая с помощью панели вкладок, и мне нужен доступ к ней из другого класса ViewController, когда нажата другая панель вкладок. Насколько я понимаю, вы можете получить доступ к переменным с помощью @property, но теперь он работает, поэтому я делаю что-то не так. Вот что у меня есть:

Class 1 Header file

@interface DailyViewController : UIViewController <UIActionSheetDelegate> {

NSDate *today;

}

@property (readwrite, nonatomic, retain) NSDate *today;



Class 2 implementation file:


- (void)viewWillAppear:(BOOL)animated{

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
DailyViewController *otherClass = [[DailyViewController alloc] init];   

NSString* todayString = [formatter stringFromDate:otherClass.today];
r_todayLabel.text = todayString;
[otherClass release];
[formatter release];

}

Ответы [ 5 ]

3 голосов
/ 16 июня 2009

Не имея

@synthesize today;

в вашем файле "Class1.m" сегодняшние методы getter и setter никогда не создаются. Это означает, что ваша собственность не может быть изменена или видна снаружи.

1 голос
/ 17 июня 2009

Вам необходимо получить объект DailyViewController * из вашего AppDelegate (или где бы он ни хранился) и извлечь из него дату.

Вы создаете новый объект DailyViewController *, не инициализируете его своей датой, а затем получаете доступ к его полю даты (по умолчанию оно равно nil).

Что-то вроде

MyAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
DailyViewController *otherClass = appDelegate.dailyViewController;
NSDate* dailyViewToday = otherClass.today;

Однако все это нарушает множество правил хорошего программирования.

Во-первых, вы должны стремиться к MVC (Model View Controller), поэтому ваша «сегодняшняя» дата должна быть сохранена в вашей модели. Тогда оба класса могли бы получать доступ сегодня из модели, а не из контроллера одного представления, и тогда для класса 2 не было бы необходимости вообще обращаться к DailyViewController, и поэтому нет необходимости хранить ссылку на него в AppDelegate, что является плохой идеей поскольку он не имеет ничего общего с делегированием для UIApplication и на самом деле является просто скрытой глобальной переменной.

0 голосов
/ 17 июня 2009

Рассматривая ответ Питера («Во-первых, вы должны стремиться к MVC (Model View Controller), поэтому ваша дата« сегодня »должна быть сохранена в вашей модели. Тогда оба класса могут получать доступ сегодня из модели, а не из одного»). Контроллер представления, а затем классу 2 вообще не понадобится доступ к DailyViewController, поэтому нет необходимости хранить ссылку на него в AppDelegate, что является плохой идеей, поскольку оно не имеет ничего общего с делегированием для UIApplication и является на самом деле просто скрытая глобальная переменная. ") У меня есть вопрос.

Как оба класса получают доступ к модели? Будет ли инициализировать вызов для каждого контроллера представления в указателе на модель? (т.е. AppDelegate создает объект модели, а затем передает указатель на каждый из методов init контроллера представления?)

Sal

0 голосов
/ 16 июня 2009

Вам нужно инициализировать сегодня, например, в конструктор DailyViewController добавить следующее:

self.today = [NSDate date];
0 голосов
/ 16 июня 2009

В исходном файле "Class1.m" у вас есть

@synthesize today;
...