gpt4 book ai didi

iphone - 在两个 UIViewController 之间访问 NSMutableArray 的正确方法?

转载 作者:行者123 更新时间:2023-12-03 21:12:28 35 4
gpt4 key购买 nike

设计问题:

我有 ViewController A,其中包含 NSMutableArray*。 ViewController A 负责向用户显示一个 map ,当用户与该 map 交互时, View Controller A 用坐标对象填充 NSMutableArray*。

NSMutableArray* 中包含的信息稍后应显示在 UITable 中,该 UITable 包含在与 ViewController B 关联的另一个 View 中。

ViewController B 访问 A 填充的 NSMutableArray 最正确的方法是什么? ( A 保存对 NSMutableArray* 的引用)。

应该有多种方法可以做到这一点,但为了保持自己对 MVC 的纯粹,我真的很想知道你的意见。

最佳答案

What is the most correct way for ViewController B to access the NSMutableArray that was filled by A?

我会做一些简单的事情,只有在导致问题时才返回决策。一些简单的事情可以在 Controller A 的公共(public)接口(interface)中公开数组并发送有关数组更新的通知,以便 B 可以观看:

@interface A
@property(readonly) NSArray *foos;
@implementation
- (void) updateFoos {
NSString *const key = @"foos";
[self willChangeValueForKey:key];
[foos doSomething];
[self didChangeValueForKey:key];
}

@interface B
@implementation
- (void) afterSettingA {
[a addObserver:self forKeyPath:@"foos" options:0 context:NULL];
}
- (void) observeValueForKeyPath: (NSString*) keyPath ofObject: (id) object
change: (NSDictionary*) change context: (void*) context
{
NSAssert([keyPath isEqualToString:@"foos"], @"Somethind fishy going on.");
// update what depends on foos
}

另一个简单的解决方案是将数组转换为一个成熟的模型类,您可以将其连接到 A 和 B。(连接必须在 Controller 外部完成以避免过度耦合。您可以使用 Interface Builder,一个将对象连接在一起的“工厂”类或任何其他合适的东西。)

@interface Foo
@property(readonly) NSArray* items;
@implementation
- (void) updateItems {
// send KVO notifications just as above
}

@interface A
@property(retain) Foo *fooModel;

@interface B
@property(retain) Foo *fooModel;

@interface Factory
@implementation
- (void) wireObjects {
A *a = [[A alloc] init];
B *b = [[B alloc] init];
Foo *fooModel = [[Foo alloc] init];
[a setFooModel:fooModel];
[b setFooModel:fooModel];
// Of course the A and B would be member variables of this
// class or you would return a root of the constructed object
// graph from this method, otherwise it would not make sense.
}

在第一个解决方案中,B Controller 必须有一个指向 A 的指针,以便它可以订阅 KVO 通知。 Controller 之间的这种连接最好在代码之外的其他地方维护,即。 B 不应该创建 A 的实例。(这样您将在 A 和 B 之间引入紧密耦合。不太可测试等)如果您已经在 Interface Builder 中实例化了 Controller ,那么这是为 B 提供指向的指针的完美位置A.(只需在 B 中为 A 创建一个 IBOutlet。)

具有单独模型类的第二个解决方案是“更干净”的 MVC,并且不需要 Controller 彼此了解 - 它们都依赖于模型类。您也可以实例化模型并将其链接到 Interface Builder 中的 Controller 。

顺便说一句:如果B想要监视A的某些属性的变化,它必须在设置到A的链接后订阅。一种简单但有点错误的方法是在 B 的 viewDidLoad 方法中进行订阅。这很方便,但如果之后 A 的链接发生更改,通知不会相应更改。更困难但正确的订阅方法是在 A 的 setter 中 - 当有人设置新的 A 时,您取消对旧 A 的通知订阅并订阅新的通知。

关于iphone - 在两个 UIViewController 之间访问 NSMutableArray 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2262441/

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