【问题标题】:Use Data From Class Without A New Init在没有新初始化的情况下使用类中的数据
【发布时间】:2012-08-10 07:22:32
【问题描述】:

我有一个 TabBar 布局,在主页选项卡中我有一个“连接”按钮,按下该按钮时会向 TransferViewController 类发送一个动作以创建一个 GameKit 会话。然后我有另一个名为“发送”的选项卡,它有一个按钮,上面写着“发送文件”,当按下该按钮时,它会向 TransferViewController 类发送一个动作,该类也使用“会话”变量,该变量是使用连接设置的发送文件,但因为它是不同的选项卡它创建了一个新的控制器实例,它希望我再次连接,但按钮位于主页选项卡上。

我是否可以在没有两个实例的情况下为两个选项卡设置一个控制器?我希望用户单击“主页”选项卡上的连接,然后切换到“发送”选项卡并按“发送文件”并通过另一个选项卡上的连接使用变量设置。如果这令人困惑,我很抱歉。

【问题讨论】:

    标签: objective-c ios cocoa-touch class uiviewcontroller


    【解决方案1】:

    这一点也不令人困惑——事实上,它一直都在出现。这在模型-视图-控制器系统中的工作方式是您设置一个模型类,使其成为单例,并在需要共享数据的所有控制器中添加对该单例的引用。

    模型.h

    @interface Model : NSObject
    @property (nonatomic, readwrite) Session *session;
    -(id)init;
    +(Model*)instance;
    @end
    

    模型.m

    @implementation Model
    @synthesize isMultiplayer;
    
    -(id)init {
        if(self=[super init]) {
            self.session = ...; // Get the session
        }
        return self;
    }
    
    +(Model*)instance {
        static dispatch_once_t once;
        static Model *sharedInstance;
        dispatch_once(&once, ^{
            sharedInstance = [[self alloc] init];
        });
        return sharedInstance;
    }
    @end
    

    现在您可以在控制器代码中使用共享会话:导入"Model.h",然后编写

    [[Model instance].session connect];
    [[Model instance].session sendAction:myAction];
    

    【讨论】:

    • 非常感谢!知道我必须在其他任何地方初始化这个模型类,还是只需要用你写的最后一个代码来引用它?
    • @Cristian 模型初始化在您第一次调用[Model instance] 时发生:dispatch_once 代码是隐藏“魔法”的地方。之后,代码只返回静态的sharedInstance
    • 现在我还有一个问题,如果我在这个新模型中有这个代码'[self presentViewController:iPicker animated:YES completion:nil];'它给了我一个关于自我的错误。有什么解决办法吗?谢谢
    • @Cristian Model 不应该呈现任何东西 - 它是一个保存共享信息和类以实现业务逻辑的地方,但所有呈现问题都需要限制在视图和视图控制器。如果您的模型需要启动一些显示交互,请添加对视图控制器的反向引用(最好作为委托),从模型中调用委托,并从委托的实现中呈现选择器(您的视图控制器可以是模型的委托) .
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多