0

我有控制器

#import <UIKit/UIKit.h>
#import "ViewBoard.h"

@interface BallsViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *InfoLabel;
@property (weak, nonatomic) IBOutlet UIButton *nextBallButton;
@property (weak, nonatomic) IBOutlet UILabel *PointLabel;
@property (weak, nonatomic) IBOutlet ViewBoard *viewBoard;

- (IBAction)NewGame:(id)sender;

@end





#import "BallsViewController.h"
#import "Field.h"
@interface BallsViewController ()
@end

@implementation BallsViewController
@synthesize viewBoard;

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.viewBoard Draw:@"Fields"];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)NewGame:(id)sender {
    self.viewBoard.canDrawBall = true;
    [self.viewBoard Draw:@"Fields"];

  }
@end

UIView

@interface ViewBoard : UIView

@end

@implementation ViewBoard
-(void)sendScoreToUI{
int score = 10;
}
@end

如何将有关分数的信息发送到 UI 并将其设置为 label ?我想UIView将此信息发送给控制器,而不是控制器从UIView.

4

1 回答 1

2

考虑 MVC,模型 - 视图 - 控制器。视图是 ViewBoard。Controller 是 BallsViewController,其中包含应用程序逻辑。模型应该是分数。

因此,您有 3 种选择来管理模型。请注意,在我的例子中,应用程序逻辑始终位于控制器内部,管理游戏和得分的控制器也是如此,而不是 UI。

选择 1:严格的 MVC

分数被建模为一个独立的对象。在这种情况下,您定义一个“分数”类,您将分数更新从控制器发送到模型,并让视图监听模型更改:


@interface Score
@property (nonatomic,assign) NSInteger points;
@end
@implementation Score
@synthesize points;
@end

然后控制器实例化对象分数:


Score *myScore;

当得分事件发生时更新它:


[myScore setPoints:30];

最后,您可以使用 KVO 让 ViewBoard 监听 myScore 上“points”属性的变化。所以在控制器内部,在 myScore 初始化之后:


[myScore addObserver:self.viewBoard forKeyPath:@"points" options:NSKeyValueOptionNew context:NULL];

注意:模型和视图仅通过 KVO 链接。所以视图不会改变分数,模型只通过 KVO 过程通知视图。当控制器消失时,KVO 链接断开。

Choice-2 :模型在控制器内部 在这种情况下,您只需向控制器添加一个新属性:


@property (nonatomic,assign) NSInteger points;

每次更新分数时,都会将新值发送到视图(它会自行更新)。您可以在积分设置器中执行此操作:每次更新内部积分属性时,您还要求 viewBoard 自行更新。

[self setPoints:30];

-(void)setPoints:(NSInteger)newPoints { points = newPoints; [self.viewBoard updatePoints:points]; }

选择 3:模型在视图内部 这种方法很简单,但通常不推荐,因为通常您不想在控制器和视图表示之间添加强依赖关系(发生这种情况是因为您的视图要求可能会影响视图控制器更新其逻辑)。还有一个限制是,在视图卸载事件中,您可能会丢失分数。在这种情况下,您将 points 属性添加到视图中:


@property (nonatomic,assign) NSInteger points;

在您的视图控制器中,您可以通过这种方式更改点:


[self.viewBoards setPoints:30];

最后,您的视图“setPoints:”setter 将包含一些“刷新”逻辑:


-(void)setPoints:(NSInteger)newPoints {
  points = newPoints;
  [self setNeedsLayout];
}

-(void)layoutSubviews {
  // here you update the subview
  [self.pointsLabel setText:[NSString stringWithFormat:@"%d",self.points]];
}



于 2013-06-03T20:04:23.440 回答