【问题标题】:Request input from the View Controller in a Model without breaking MVC in Objective C从模型中的视图控制器请求输入而不破坏 Objective C 中的 MVC
【发布时间】:2015-01-12 02:53:09
【问题描述】:

我有一个 Objective C 应用程序,我正在尝试遵循 MVC 指南。

在我的模型中有一点需要用户输入才能进行任何进一步的计算。

有没有一种优雅的方式可以在不破坏 MVC 的情况下向控制器请求输入?

我现在能想到的唯一方法就是从模型中的方法向控制器返回一个非零值,然后让控件调用一个单独的方法将输入发送到模型。

我希望有其他方法可以在模型等待来自控制器的输入时暂停执行模型中的代码。

这是一些适用的代码。为了便于阅读,我简化了大部分内容。

相关的ViewController函数:

@implementation GameViewController

-(void)tap:(UITapGestureRecognizer *)gesture
{
    if(gesture.state == UIGestureRecognizerStateEnded) {
        id view = gesture.view;
        if ([view isKindOfClass:[GameBoardTileView class]]) {
            GameBoardTileView *gameTileView = (GameBoardTileView *) view;
            int row = gameTileView.row;
            int col = gameTileView.col;
            [self.game chooseTileAtRow:row column:col];

            // Updates states of all game tiles after tapping one tile               

            [self updateTiles];

        }
    }
}

@end

相关模型功能:

-(void)chooseTileAtRow:(int)row column:(int)col
{
    // Retrieves the game tile at the spot just selected

    GameBoardTile *tile = [self retrieveTileAtRow:row column:col];

     // Makes sure the spot is empty
    if (tile.companyType == -1) {

        // If no company type is found generate a random company type
        if (!tile.companyType) {
            //NSLog(@"changing company type");

            if ([self.chainsInPlay count]) {

                /////////// Would like index to be given by the Controller instead of randomly generated
                int index = [self generateRandomNumber:0 end:[self.chainsInPlay count]-1];

                tile.companyType = [[self.chainsInPlay objectAtIndex:index] intValue];                        
                [self.chainsInPlay removeObjectAtIndex:index];
            }
        }
    }
}

视图控制器的作用是跟踪一个瓦片网格,当点击单个瓦片时,它会使用chooseTileAtRow:column: 将该行和列发送到模型。该模型在该行和该列检索GameBoardTile 并获取companyType。如果companyType 不存在(== 0),我希望它被设置。目前它只是为测试目的生成一个随机数。理想情况下,我希望从控制器传入这个数字并通过用户输入进行选择。

【问题讨论】:

  • 查看一些适用的代码会有所帮助。这样我们就可以看到您是如何实现 MVC 并提供反馈的
  • 我附上了一些非常简化的代码。我希望这会增加一些清晰度。

标签: objective-c model-view-controller


【解决方案1】:

您应该很可能正在使用委托模式。

本质上,基类可以将自己定义为视图控制器的委托,同时实例化视图控制器。您使用协议来确保基类实现所有必要的方法。然后,您的视图控制器可以盲目地调用委托上的方法(通常是传递参数)。

【讨论】:

    【解决方案2】:

    您不能“暂停执行”或“等待”;不要这么想。

    模型具有属性needsMoreInfo 或从某些数据请求或其他方法返回false 或nil 是完全合理的,以表明它在没有进一步信息的情况下无法继续。

    控制器因此可以在请求实际计算之前询问模型是否需要更多信息并提供它。

    【讨论】:

    • 好的,我只是想了解在 MVC 中编码时这是否是常见做法。我将按照我最初的直觉将方法拆分出来并返回类似错误的值。
    • 好吧,我认为大多数人并没有像您显然试图做的那样在控制器和模型之间保持令人钦佩的强烈分离!但从某种意义上说,这与在我们还没有数据时使用 nil 占位符没有什么不同,这当然很常见。
    【解决方案3】:

    我认为您必须拆分模型的方法,以便您可以调用 VC 中的不同部分。这取决于您的 MVC 逻辑。您还可以使用 NotificationCenter 或委托模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多