gpt4 book ai didi

ios - 如何使用 KVO 传递值?

转载 作者:可可西里 更新时间:2023-11-01 03:53:17 26 4
gpt4 key购买 nike

我正在学习如何使用 KVO。我创建了两个类,卡车和司机,如下所示。

Truck 类有一个文本字段和一个按钮,文本应包含当前卡车速度,按下按钮时,应调用 prepareForSegue,它包含下面发布的代码。

Driver 类包含一个应填充卡车速度的文本字段。 Truck 类中的卡车速度将通过 KVO 传递到 Driver 类中的文本字段,如代码所示。

我遇到的问题或我正在尝试做的是,当用户在 Truck 类中输入卡车的速度并按下按钮时,我想通过以下方式显示在 Driver 类的文本字段中输入的卡车速度KVO

我根据下面发布的代码得到的结果是,Driver 类中的一个空文本字段

请告诉我为什么驱动程序类中的文本字段为空。以及我应该如何通过 KVO 将卡车速度的值从卡车类传递到司机类

卡车.m

#import "TruckViewController.h"
#import "DriverViewController.h"
#import "ServerViewController.h"

@interface TruckViewController ()

@property (strong, nonatomic) IBOutlet UITextField *textFieldCurrenSpeed;
@property (strong, nonatomic) IBOutlet UIButton *buttonBroadcast;
@property (strong, nonatomic) IBOutlet UIButton
*buttonToDriverViewController;
@property (strong, nonatomic) IBOutlet UIButton
*buttonToServerViewController;
@property (strong, nonatomic) TruckViewController *truck;
@property (strong, nonatomic) DriverViewController *driver;
@property (strong, nonatomic) ServerViewController *server;

@end


@implementation TruckViewController


- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}


- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}


-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
self.truck = [[TruckViewController alloc] init];
self.driver = [[DriverViewController alloc] init];
self.server = [[ServerViewController alloc] init];

if ([segue.identifier isEqualToString:@"segueToDriver"]) {

[self.truck addObserver:self.driver
forKeyPath:@"currentSpeedOfTheTruck"
options:NSKeyValueObservingOptionNew
context:NULL];

self.truck.currentSpeedOfTheTruck = [self.textFieldCurrenSpeed
text];
NSLog(@"prepareForSegue: %@", self.truck.currentSpeedOfTheTruck);
}

if ([segue.identifier isEqualToString:@"segueToServer"]) {

[self.truck addObserver:self.server
forKeyPath:@"currentSpeedOfTheTruck"
options:NSKeyValueObservingOptionNew
context:NULL];

self.truck.currentSpeedOfTheTruck = [self.textFieldCurrenSpeed
text];
NSLog(@"text entered: %@", self.truck.currentSpeedOfTheTruck);

}

}

- (void)dealloc
{
[self.truck removeObserver:self.driver
forKeyPath:@"currentSpeedOfTheTruck"];
[self.truck removeObserver:self.server
forKeyPath:@"currentSpeedOfTheTruck"];
}

Driver.m

  #import "DriverViewController.h"

@interface DriverViewController ()
@property (strong, nonatomic) IBOutlet UITextField
*textFieldCurrentSpeed;

@end


-(void) observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey,id>
*)change
context:(void *)context {

if ([keyPath isEqualToString:@"currentSpeedOfTheTruck"]) {
NSLog(@"DriverViewController->currentSpeedOfTheTruck: %@",
[object valueForKey:keyPath]);

NSLog(@"DriverViewController->currentSpeedOfTheTruck: %@",
[change objectForKey:NSKeyValueChangeNewKey]);

self.receivedCurrentSpeed = [change
objectForKey:NSKeyValueChangeNewKey];
[self.textFieldCurrentSpeed setText:self.receivedCurrentSpeed];

}
}



- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.

NSLog(@"DriverViewController->viewDidLoad");

[self.textFieldCurrentSpeed setText:self.receivedCurrentSpeed];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

日志输出:

2017-08-13 19:53:55.293 KVC-1[91529:2346883] DriverViewController-  
>currentSpeedOfTheTruck: 45

2017-08-13 19:53:55.294 KVC-1[91529:2346883] DriverViewController-
>currentSpeedOfTheTruck: 45
2017-08-13 19:53:55.294 KVC-1[91529:2346883] prepareForSegue: 45

最佳答案

问题出在这几行代码上

 self.truck = [[TruckViewController alloc] init];
self.driver = [[DriverViewController alloc] init];
self.server = [[ServerViewController alloc] init];

由于您在准备 segue 之前创建了另一个对象而不是一个对象,因此您应该使用 segue.destinationController 来传输值

把上面这行代码改成

 self.truck = (TruckViewController *) segue.destinationViewController;

根据所有 View Controller 。

关于ios - 如何使用 KVO 传递值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45641448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com