2013-07-27 2 views
0

Недвижимость в моем AppDelegate.h: @property (retain, nonatomic) NSString *bmiShared;. (Он синтезируется в моей AppDelegate.m.)Данные, передаваемые между контроллерами просмотра, не работают

У меня есть AppDelegate.h импортируемого в обоих файлах заголовков View Controller. У меня также есть AppDelegate *appDelegate в каждом заголовке.

В обоих файлах реализации (ViewController.m и TipsViewController.m) у меня есть:

appDelegate.bmiShared = bmiView.text; 
appDelegate = [[UIApplication sharedApplication] delegate]; 

Я понятия не имею, что я делаю неправильно при передаче данных через. Я хочу, чтобы floatValue из bmiView.text был доступен для использования в моем TipsViewController, так что если floatValuebmiView.text - это определенная сумма, он отобразит правильную информацию в моем TipsViewController view. Я использую раскадровки, если это имеет значение.

ответ

0

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

  1. Создайте объект в своем «контроле» для просмотра данных.
  2. Получите ссылку на контроллер «переход к», который у вас есть или будет отображаться на экране.
  3. Задайте значение этого свойства, которое вы создали, с данными вашего контроллера «переход от».

Шаг, который вызывает большинство новичков, является # 2. Вы не можете просто выделить init экземпляр контроллера «переход к», вам нужно получить ссылку на созданную вами, как правило, в xib или раскадровке. Как именно это зависит от того, как эти два контроллера связаны друг с другом. Создает ли экземпляр другого, а затем нажимает или представляет его? Это «переход к» контроллеру, созданному в xib, раскадровке или в коде? Являются ли контроллеры встроенными в контроллер навигации или контроллер панели вкладок? Вы переходите ко второму контроллеру в коде или непосредственно с помощью segues? Это те вопросы, о которых вам нужно подумать, и понять, как отвечать, поэтому вы можете получить все правильно с любой настройкой, которую у вас есть.

Если вы можете объяснить вам контроллера установки (как два связаны друг с другом, и где вы сделали их), я могу указать вам на более конкретный ответ на шаге 2.

После Edit:

Когда вы перемещаетесь между видами с помощью segues, место, куда вы передаете данные, находится в prepareForSegue. TipsViewController будет segue.destinationViewController, так что вы сделать это следующим образом:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"segueName"]) { 
     TipsViewController *tipsVC = [segue destinationViewController]; 
     tipsVC.bmi = self.bmi; 
    } 
} 

В этом примере предполагается, что вы создали свойство в TipsViewController называется BMI, и что вы один называется, что в ViewController, а также. Все это описано в «Руководстве по программированию контроллера просмотра для iOS», которое вы должны изучить.

+0

1.) Я двигаюсь непосредственно с помощью segues. 2.) Они представляют собой контроллеры с одним представлением. 3.) Вот как они соотносятся друг с другом. Первый контроллер представления (ViewController) вычисляет BMI пользователя, а затем отображает его на этикетке. Для получения дополнительной информации о результатах пользователя пользователь может нажать кнопку, чтобы перейти к следующему контроллеру представления (TipsViewController). TipsViewController будет отображать информацию, основанную на результатах пользователя, и я не могу передать ее. Некоторый вызов BMI для определенных объектов отображается на ConnectViewController. Мне нужен окончательный BMI, который будет использоваться среди просмотров. –

+0

@LoganLarroque, я отредактировал свой ответ. – rdelmar

+0

Хорошо, я поставил код, который вы предоставили в моем ViewController.m, и создал 2 свойства. Мой вопрос: что мне связать свойство в TipsViewController тоже, если у меня нет метки, присутствующей в представлении? Кроме того, я получаю много ошибок, потому что мой ярлык из ViewController (bmiView.text) недоступен в TipsViewController. Вот фрагмент кода: 'if ([** bmiView.text ** floatValue] <16.00) { category.image = [UIImage imageNamed: @" bmi__0009_SEVTHIN.png "]; strictThin.image = [UIImage imageNamed: @ "bmi__0011_MARKER"]; ' –

0

На основании кода, который вы указали, одна из возможностей заключается в том, что вы пытаетесь присвоить значение appDelegate.bmiShared до того, как appDelegate было присвоено значение (т. Е. Оно равно нулю). Попробуйте поменять эти две линии так, у вас есть

self.appDelegate = [[UIApplication sharedApplication] delegate]; 
self.appDelegate.bmiShared = bmiView.text; 

Есть целый ряд других вещей, которые могли бы идти не так, но не видя весь код, это кажется наиболее вероятным объяснением.

+0

Я предоставил ссылку для загрузки моего проекта, если вы хотите увидеть остальную часть кода: http://www.mediafire.com/?9ewpz0uljf4hehv –

0

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

Singleton.h 
@property (nonatomic, strong) NSString *bmiShared; 
+(Singleton *)sharedStore; 

#import "Singleton.h" 

@implementation Singleton 

+(Singleton *)sharedStore 
{ 
    static Singleton *sharedStore = nil; 

    if (!sharedStore) { 
     sharedStore = [[super allocWithZone:nil] init]; 
    } 

    return sharedStore; 
} 

+(id)allocWithZone:(NSZone *)zone 
{ 
    return [self sharedStore]; 
} 

-(id)init 
{ 
    self = [super init]; 

    if (self) { 
     _bmiShared = [[NSString alloc] init]; 
} 

    return self; 
} 
@end 

Это должно сработать. Когда вы хотите установить строку, импортируйте singleton, alloc/init it, а затем установите свойство bmiShared, как и любое другое свойство. Сделайте то же самое для аксессора на представлении, которое вы хотите увидеть.

+0

, поэтому мне пришлось бы добавлять новые файлы Objective-C Class под NSObject? Я действительно не знаю, как реализовать синглтон. Так же, как я дал другому человеку, который ответил на мой вопрос, вот ссылка для скачивания: http://www.mediafire.com/?9ewpz0uljf4hehv. –

+0

Да, создайте новый класс как подкласс NSOBject и реализуйте его, как указано выше. –

+0

Хорошо, я поставил выше в Singleton.m (справа?). Если я прав, что-нибудь происходит в .h? –

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