0

Хорошо, поэтому я пытаюсь передать данные с одного контроллера вида на другой с помощью следующего кода, но его не работает, и я понятия не имею, почему.Передача данных через ViewControllers Not Working

В моей ViewController.m я импортировал ViewControllerTwo.h и объявил ViewControllerTwo:

#import "ViewController.h" 
    #import "ViewControllerTwo.h" 

    @interface ViewController() 

    @end 

    @implementation ViewController 
    { 
     ViewControllerTwo *settings; 

    } 
    @synthesize blockSizeLB; 
    @synthesize wpmLB; 
    @synthesize textTV; 
    @synthesize slider; 
    @synthesize stepper; 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    //sets label to corresponding value 
    wpmLB.text = [NSString stringWithFormat:@"WPM: %@", [[NSNumber numberWithInt:slider.value] stringValue]]; 

    //configure stepper and its label to default values of 1 
    stepper.value = 1; 
    blockSizeLB.text = [NSString stringWithFormat:@"Block Size: %@", [[NSNumber numberWithInt:stepper.value] stringValue]]; 

    //sets properties for next ViewController 
    settings = [[ViewControllerTwo alloc] init]; 
    settings.timerValue = 60/slider.value; 
    settings.text = textTV.text; 
    settings.blockCount = stepper.value; 



} 

В ViewControllerTwo.h у меня есть:

@property (nonatomic) float timerValue; 
@property (nonatomic) NSString * text; 
@property (nonatomic) int blockCount; 

Позже в ViewController.m мне нужно измените свойства, определенные в ViewControllerTwo: Метод из ViewController.m. Это также сделано ранее в моем viewDidLoad, чтобы установить значения по умолчанию свойств:

- (IBAction)sliderSlide:(id)sender 
{ 
    //event when the slider value is changed 


    //rounds value to nearest increment of 5 
    int increment = 5 * floor(((int)slider.value/5)+0.5); 
    [slider setValue:increment animated:YES]; 

    //changes WPM: 0 label text 
    wpmLB.text = [NSString stringWithFormat:@"WPM: %@", [[NSNumber numberWithInt:increment] stringValue]]; 

    //sets properties for next ViewController 
    settings.timerValue = 60/slider.value; 
} 

Я стараюсь, чтобы проверить, если это удастся, вызвав метод в ViewControllerTwo.m, который регистрирует его свойство blockCount через NSLog. Выходной результат (ноль) означает, что я был неуспешен в передаче данных с ViewController.m в ViewControllerTwo

+1

Где ты инициализировать переменную 'settings', чтобы указать на фактический объект ViewControllerTwo? –

+0

Я обновил его, включив мой метод viewDidLoad, где я его разместил. Может ли это потому, что Im устанавливает значения в свойство до того, как оно будет синтезировано в ViewControllerTwo.m? – user2692560

+0

Я подозреваю, что экземпляр 'ViewControllerTwo', который вы создаете как' settings', является тем же, который вы тестируете. Если вы регистрируете значение 'settings', когда вы присваиваете ему значения и значение' self', когда 'ViewControllerTwo' печатает свой' blockCount', они показывают тот же адрес? –

ответ

1

Если вы используете перетекает, вы должны делать это внутри:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
Затем назовите ваш SEGUE, то сделать что-то вроде этого:

if([segue.identifier isEqual: @"segue_From_1_To_2"]) 
{ 
    ViewControllerTwo *vc2 = segue.destinationViewController; 
    vc2.timerValue = 123.45; 
    vc2.text = @"whatever"; 
    vc2.blockCount = 1; 
} 
-1

Вы можете создать собственный инициализатор в вашем viewControllerTwo. назовите его initWithTimerValue:

- (id)initWithTimerValue:(CGFloat)timerValue 
{ 

self = [super init]; 
if (self) { 
self.timerValue = timerValue; 
} 

return self; 

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