0

我正在通过 iTunesU 上的斯坦福 CS193P 课程,对如何在作业 4 中完成最近查看的照片部分感到有些困惑。

在作业中,我们将有一个带有两个选项卡的选项卡栏控制器。第一个选项卡是一个导航控制器,将显示一个地点表,它将推送一个照片名称表,这将推送一个带有照片的滚动视图 第二个选项卡是一个导航控制器,将显示一个最近查看的照片表,它将推送带有照片的滚动视图。

我有第一个选项卡工作,现在当我用图像推送滚动视图时,我还想将该照片添加到最近的照片数组中,哪个 MVC 应该拥有这个最近的照片数组?

  1. 选项卡视图控制器(如果是这样,文档说这个类不用于子类化)

  2. 第二个选项卡的根表视图控制器(如何将当前照片传递给实例在另一个选项卡中)(坦率地说,第一个选项卡应该知道第二个选项卡)

  3. 第一个选项卡的根表视图控制器(那么第二个选项卡如何从第一个选项卡中提取这些数据?)

  4. 别的东西

我想我对 MVC、协议、委托和数据源仍然很模糊。如果您有我可以查看的这项任务的解决方案,我将不胜感激。

我最终从用户默认值中推送和拉取数据。虽然我很好奇为什么标签栏控制器不适合子类。当多个选项卡需要数据时,这似乎是最合乎逻辑的地方。

4

3 回答 3

1

我做过类似的事情,如果我没有完全误解你的问题,你可以创建一个可以像某种共享数据库一样工作的 Singelton。它永远不会以正常方式初始化,只是在您第一次使用时创建。这个 singelton 可以包含您的数组,然后您可以通过编写以下代码从任何地方调用它:

[SingeltonType main].sharedPhotos

以下示例来自我自己的代码,其中我有一个“用户”,它是应用程序的所有者。我在那里存储了一个数据库,其中包含在运行时任何地方都可以使用的信息。

标题:

@interface User : NSObject {
Database *_storage;
}

@property (nonatomic, retain) Database *storage;

+(User*)owner;

主文件:

#import "User.h"

@implementation User

@synthesize password = storage = _storage;

static User* _owner = nil;

+(User*)owner {
    @synchronized([User class]) {
        if(!_owner) [[self alloc] init];

        return _owner;
    }
    return nil;
}

+(id)alloc {
    @synchronized([User class]) {
        NSAssert(_owner == nil, @"Attempted to allocate a second instance of a singleton.");
        _owner = [super alloc];

        return _owner;
    }
    return nil;
}

-(id)init {
    self = [super init];

    if(self != nil) {
        self.storage = [[[Database alloc] init] autorelease];
    }
    return self;
}

然后我就这样称呼它:

[User owner].storage // which gives me access to it 

希望有帮助!如果您需要从不同的地方访问数据真的很有用:)

注意:您将只有一个此对象的实例,不能创建更多。

于 2012-03-09T05:35:37.700 回答
1

经过一堆额外的搜索,我没有找到任何一种一致的方式将数据从选项卡传递到选项卡。

由于我们只存储相对少量的数据,我决定创建一个类,使用类方法(为了方便)将数据推送和拉入用户默认值。

于 2012-03-10T06:13:55.993 回答
0

我通过使用协议来解决这个问题。我在显示图像(和 UIScrollView)的类中创建了协议。然后我在“查看的照片”tableController 类中采用了协议,并实现了传递查看图像的协议方法。我遇到的问题是您如何将“查看的照片”tableController 类定义为委托,因为 1)它尚未加载,并且可能直到查看图片后才加载 2)您如何通过导航工作控制器和选项卡控制器指向声明协议的类。希望从这里的专家那里听到关于协议或类方法是否是编程方法的正确方法?

谢谢知识库

于 2012-07-05T05:18:56.807 回答