2013-05-27 5 views
0

Как получить доступ к значению из поля ввода, расположенного во втором viewController?Как получить доступ к значениям из другого UIViewController

Имя класса второго контроллера представления является SettingsViewController и имя выход для InputField является setRateInput.

Я попытался это, но он не работает ...

double taxRateFromInput = [[self.settings.setRateInput text]doubleValue]; 

когда я NSLog это выходит как Значение: (нуль)

Любая идея, что я делаю неправильно?

Вот файл реализация для главного ViewController:

#import "SettingsViewController.h" 

@interface ViewController() 

@property (strong, nonatomic) SettingsViewController * settings; 

@end 

@implementation ViewController 

// lazy instantiation 
-(SettingsViewController *) settings 
{ 
    if (_settings == nil) { 
     _settings = [[SettingsViewController alloc]init]; 
    } 
    return _settings; 
} 


- (IBAction)calculatePrice:(id)sender { 


    double taxRateFromInput = [[self.settings.setRateInput text]doubleValue]; 

@end 
+0

_settings.setRateInput вместо self.settings.setRateInput? – lakesh

+0

Вы создаете новую настройку, вам нужно позвонить оригиналу. Устанавливает родителя? как иерархия? – Vertig0

ответ

1

Теоретически вы можете создать глобальный. Создайте новый класс, назовем его что-то вроде TaxRate (.h и .m)

В taxRate.h, добавьте следующий код:

#import <Foundation/Foundation.h> 
@class MyTaxRate; 

@interface TaxRate : NSObject { 


} 

@property (nonatomic, retain) double * taxRateFromInput; 

+(TaxRate*)getInstance; 

@end 

Затем в контроллере, поставить «#import TaxRate .h "там. В файле .m, добавьте следующее:

#import "TaxRate.h" 

@implementation TaxRate 


@synthesize taxRateFromInput; 

static TaxRate *instance =nil; 

+(TaxRate *)getInstance 
{ 
    @synchronized(self) 
    { 
     if(instance==nil) 
     {   
      instance= [TaxRate new]; 
     } 
    } 
    return instance; 
} 


@end 

Примечание: Это в структуре extremely similar к тому, что я намереваясь.

0

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

Но обратите внимание, что выходы не подключаются до тех пор, пока не будет вызван видDidLoad. Поэтому, если вы просто выделите/запустите свой viewController (лениво), выход в текстовое поле указывает на нуль. Выход не подключается, пока не будет доступно свойство вида вашего контроллера, т.е. отображается представление.

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

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

Другая возможность - может быть, даже лучше - это определить объект модели, который выполняет расчет, и позаботится о скорости, которую он должен вычислить. Затем вы можете дать вашим настройкам controlcontroller ссылку на этот объект модели (вероятно, созданный в вашем другом viewController), так что он может изменить скорость на нем.

PS: также повторно подумайте, как вы создаете экземпляр видаКонтроллеры в целом. Назначенный инициализатор равен -initWithNibName:bundle: - поэтому обычно вы не просто выделяете/-init им. Если вы используете раскадровки (вы, вероятно, должны!), Используйте раскадровку -instantiateViewControllerWithIdentifier: или используйте вышеупомянутый назначенный инициализатор.

+0

Спасибо за ваш ответ. Я предполагаю, что есть некоторые концепции программирования, которые я до сих пор не понимаю, я утверждал, что после того, как вы импортировали и создали экземпляр класса, у вас был полный доступ к его общедоступному API, но, похоже, я все еще не понимаю. Вы знаете, где я могу больше узнать об этой концепции, чтобы лучше понять ее? –

+1

Я всегда рекомендую посмотреть классы cs193p из Стэнфорда - доступно через iTunes U – Mario

+0

Я дам им попробовать, спасибо. –

1

Вы создали экземпляр нового SettingsViewController, но вы ничего не сделали для создания его текстового поля setRateInput. Вы можете сделать это, когда вы его экземпляр:

_settings = [[SettingsViewController alloc]init]; 
_settings.setRateInput = [UITextField alloc] initWithFrame:someFrame]]; 

или, как Beter решение, экземпляр текстового поля в -init из SettingsViewController

- init { 
    if (self = [super init] { 
    self.setRateInput = [UITextField alloc] initWithFrame:someFrame]]; 
    } 
    return self; 
} 

При использовании NIB файлов, это было бы намного проще ,

Примечание:setRateInput является плохим названием для объекта. Вместо этого рассмотрите rateTextField.

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

Так будет, как,

_settings = [[SettingsViewController alloc]init]; 
_settings.setRateInput = [[UITextField alloc] initWithFrame:someFrame] autorelease]; 
[_settings.view addSubView:_settings.setRateInput]; 

В этом случае setRateInput удерживается его супер видом. Вы не используете ARC, поэтому вы можете позвонить autorelease в текстовое поле.

Лучшее решение: Используйте - (void) loadView; внутри SettingsViewController. Загрузка представления зависит от контроллера соответствующего вида.

- (void) loadView { 
    self.setRateInput = [[UITextField alloc] initWithFrame:someFrame] autorelease]; 
    [self.view addSubView:_settings.setRateInput]; 
} 

Edit:xib files и storyboards может помочь вам. Попробуйте эти обучающие программы.

+0

Когда я создаю экземпляр textField, я получаю предупреждение, в котором говорится: Присвоение сохраненного объекта слабой собственности; объект будет выпущен после ассистента ** Любая идея, что это такое? - (SettingsViewController *) настройки { if (_settings == nil) { _settings = [[SettingsViewController alloc] init]; _settings.setRateInput = [[UITextField alloc] initWithFrame: CGRectMake (10, 20, 200, 20)]; } return _settings; } –

+1

Свойство 'setRateInput' определяется как' слабый' в 'SettingsViewController'. 'alloc' возвращает сохраненный объект. Измените его на 'keep'. –

+0

@fs_tigre Проверьте мои новые изменения. –

1

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

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