【问题标题】:CS193P UITabBarController MVC Help on Assignment 4CS193P UITabBarController MVC 帮助关于作业 4
【发布时间】:2012-03-26 14:46:05
【问题描述】:

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

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

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

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

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

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

  4. 别的东西

我想我仍然对 MVC、协议、委托和数据源感到困惑。如果您有解决此任务的方法,我可以浏览一下,我将不胜感激。

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

【问题讨论】:

    标签: objective-c model-view-controller uitabbarcontroller cs193p


    【解决方案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 
    

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 你不能用一个singelton吗?那么您不必传递对它的引用,因为您从未以正常方式创建它。它在某种程度上类似于静态变量,但您可以将方法和变量连接到它,并且当您在一个选项卡中向其中添加内容时,当您在另一个选项卡中获取它时它就会在那里。
      • 我不明白为什么不这样做,但这项任务需要的另一个功能是在应用程序启动之间存储最近查看的照片。所以用户默认完成了这两个任务。
      • 在单独的班级中隐藏最近的照片听起来是个好主意。但是,您仍然需要在某处创建该类并在控制器之间传递实例。你是怎么做到的?
      【解决方案3】:

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

      谢谢 知识库

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        相关资源
        最近更新 更多