两个类之间的 iPhone KVO

2024-03-15

我的应用程序中有两个类 A 类和 B 类。A 类和 B 类都是 UIViewController 的实例。 A 类有一个按钮,按下该按钮时会将 B 类推入堆栈。 B 类有一个字符串,A 类希望观察该字符串并根据需要更新其接口。我已经能够使用:[self addObserver:self forKeyPath:@"name" options:0 context:NULL];在B类中查看字符串的变化。 当我尝试在 A 类 viewWillAppear 方法中使用以下内容时:

ClassB *b = [[ClassB alloc]init];
[b addObserver:self forKeyPath:@"name" options:0 context:NULL];

并添加方法:

(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object
                      change:(NSDictionary )change
                     context:(void )context

当尝试从 A 查看 B 中所做的更新时,不会触发任何操作。我觉得问这个问题很愚蠢,但是 KVO 在 iOS 中的两个类之间如何工作?我知道这应该有效。


您可以观察不同对象/类之间的变化。我认为问题出在选项参数中addObserver:forKeyPath:options:context:.

对于您想要进行的观察类型,有多种选择。这KVO指南 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/Concepts/KVOBasics.html是一个很好的起点,但你可能想要NSKeyValueObservingOptionNew,我在下面的示例中使用它。

首先,“name”应该是B类中的公共属性。

其次,您可能不需要将观察者添加到“b”中viewWillAppear在 ClassA 中,因为您不需要每次 A 类视图出现时都添加它。当您创建 B 类视图时,您只需要添加一次观察者。添加观察者后,observeValueForKeyPath:ofObject:change:context:方法将在 Class 中执行,因此您可以从那里更新 A 类 UI。每次 ClassA 即将出现时,你不需要做任何事情。

在类 A 中,您可能应该在将 ClassB 推送到控制器堆栈之前创建 ClassB,大概是在用户执行某些操作的事件处理程序中。创建 ClassB 后,立即使用正确的 NSKeyValueObservingOption 值在 ClassA 中添加观察者。

如果您只想在 ClassB 中的公共属性“名称”更改时收到通知,请尝试以下操作:

ClassB

@interface ClassB : UIViewController {
}

@property (retain) NSString* name;

- (void) aMethodThatModifiesName:(NSString*)newName;

@end


@implementation ClassB 

@synthesize name;

- (void) aMethodThatModifiesName:(NSString*)newName {
    // do some stuff
    self.name = newName;
}

@end

ClassA

@interface ClassA : UIViewController {
}

@property (nonatomic, retain) IBOutlet UILabel* nameLabel;

- (IBAction) someEventHandler:(id)sender;

@end

@implementation ClassA

- (IBAction) someEventHandler:(id)sender {
    ClassB* b = [[ClassB alloc]init];
    [b addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL];
    [self.navigationController pushViewController:b animated:YES];
    [b release];
}

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
    if ([keyPath isEqual:@"name"]) {
        NSString* changedName = [change objectForKey:NSKeyValueChangeNewKey];
        // do something with the changedName - call a method or update the UI here
        self.nameLabel.text = changedName;
    }
}

@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个类之间的 iPhone KVO 的相关文章

  • 如何将 UIImage 和 UILabel 合并为一张图像并保存

    我有 2 个 UILabels 和 2 个图像 我需要将它们合并到一个 UIImage 中进行保存 我知道我可以用屏幕截图来做到这一点 但我的主图像是圆形的 所以如果我对其进行校正 它仍然会显示锐利的边缘 我可以这样做来组合图像 CGSiz
  • 处理ios设备方向

    我的 uiview 遇到问题 具体取决于设备方向 我遇到的主要问题是 UIDeviceOrientationFaceUp UIDeviceOrientationFaceDown 扰乱了我的视图 我只想支持纵向和横向 左右 因此如果设备改变方
  • iPhone切换按钮的实现

    我想在我的 iPhone 应用程序中创建一个切换按钮 但是 我不知道最好的方法是什么 我正在考虑两种选择 我可以对 UIButton 进行子类化 这样我就不必实现触摸处理 我可以创建一个返回一个布尔值的方法 指示按钮是处于打开还是关闭状态
  • 将第二个 UIWindow 与 rootViewController 一起使用时,界面旋转变黑

    iOS 7 0 3 Xcode 5 0 1 我的应用程序中有第二个 UIWindow 用于在状态栏上方显示自定义放大镜 但是 一旦我设置了该窗口的 rootViewController 用于界面旋转和其他一些东西 主窗口在界面旋转动画期间就
  • Storekit /应用程序内购买:当我将应用程序提交到应用程序商店时,“环境:沙盒”标签是否会消失?

    这是我第一次实施应用内购买 在应用内购买的开发和测试过程中 我在购买过程中看到以下警报 我的应用程序内购买运行良好 应用程序即将提交 在提交应用程序之前我是否必须执行某些操作 以使 环境 沙盒 标签消失 或者所有这些都在我提交时自动处理 你
  • iOS7:我们可以在 Dynamic Type 中使用 Helvetica Neue 以外的字体吗?

    我们正在为 iOS7 设计一个应用程序 我们的设计师想要使用非默认字体 Avenir 但我不想失去动态类型功能 据我了解 动态类型只能与默认系统字体 Helvetica Neue 一起使用 是否可以使用其他字体 或者目前无法选择 据我了解
  • ios UIPanGestureRecognizer 指针位置

    UIPanGestureRecognizer panRecognizer UIPanGestureRecognizer alloc initWithTarget self action selector pan self addGestur
  • 如何在HTTP post中向PHP服务器发送多个参数

    我正在将 base64 字符串发送到 php 服务器 并且运行良好 现在我想以字符串形式发送另一个参数 谁能告诉我下面的代码中需要添加什么代码 下面的代码适用于单个参数 我们如何修改它的多个参数 NSData data UIImageJPE
  • SwiftUI 关闭多个模态表

    我在用 sheet isPresented self showModal 在我的根视图中呈现一个模式 在模态中 我正在使用NavigationView引导用户浏览各个页面 对于用户配置文件构建器 在导航堆栈的最后一页中 我正在使用 Envi
  • 将标题和图像添加到导航栏

    我需要将 UIViewController 的名称和图像设置为导航栏 到目前为止 我可以显示图像 但标题当然丢失了 show image UIImage image UIImage imageNamed bar icon png UIIma
  • Captive Wifi 弹出窗口:单击链接打开 Safari

    我们的 iOS 设备 ipad iphone 等 网络出现问题 连接到 SSID 后 iphone ipad 立即打开强制网络助手 CNA 它就像一个缩小版的浏览器 没有导航按钮等 显示我们的欢迎页面 准备好让用户在网络中验证他的 MAC
  • 从选项卡栏项目中删除徽章

    如何从选项卡栏项目中删除徽章我使用了下面的代码 但不适合我 UITabBarItem chatbadge appDelegate tabBarController tabBar items objectAtIndex 2 chatbadge
  • iPhone 4G 拍照时应用程序崩溃?

    我已从我的设备中拍摄照片并调整图像大小并将其设置到我的图像视图框架 但我的应用程序在拍摄照片后有时会崩溃 使用调整大小 现在我已经用 iPhone 4G 拍了这张照片 仅当许多应用程序在后台运行 多任务 时 应用程序才会崩溃 那么我该如何解
  • 在 Xcode 4.2 中启用崩溃日志符号

    我使用的是 Xcode 4 2 我的崩溃日志没有被符号化 如何在 Xcode 4 2 中启用此功能 请浏览苹果的文档 http developer apple com library ios technotes tn2151 index h
  • 优化 - 步进可能表现奇怪:iOS/Unity

    我正在尝试将 Unity 集成到 iOS 应用程序中 我已经遵循了这个教程http www agnosticdev com blog entry swift integrating unity and vuforia ios swift p
  • 从 AppDelegate 启动 ViewController

    我有一个自定义 URL 方案 我想打开某个ViewController当我访问此 URL 时 这不是根 我已经能够做到这一点 剩下的就是推动这一点ViewController进入navigationController来自AppDelega
  • 如何使用 AVCaptureVideoPreviewLayer 从相机应用程序实现 2 倍变焦

    我的应用程序中有一个 AVCaptureVideoPreviewLaye 它运行良好 并且显示与相机应用程序相同的预览视频 我想实现相机应用程序的 2 倍变焦功能 我该怎么做呢 基本上 我希望我的预览层将视频源更改为与您在点击 1x 图标将
  • 无法识别的选择器发送到类

    我已经看到 这是一个常见问题 但我自己找不到任何解决方案 这是代码 class ButtonViewController UIViewController override func viewDidLoad super viewDidLoa
  • UICollectionViewFlowLayout IOS的​​minimumLineSpacing属性

    对于UICollectionViewFlowLayout的属性minimumLineSpacing 苹果的文档说 对于垂直滚动网格 该值表示最小值 连续行之间的间距 对于水平滚动的网格 该值表示连续列之间的最小间距 我测试它和代码的一部分是
  • 在 iOS 上使用 OpenGL ES 2.0 进行实例化绘制

    简而言之 谁能确认是否可以使用内置变量gl InstanceID or gl InstanceIDEXT 在 iOS 上使用 OpenGL ES 2 0 的顶点着色器中GL EXT draw instanced启用 Longer 我想使用绘

随机推荐