【发布时间】: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