从UIView类信息发送到UIViewController

时间:2013-06-03 19:43:06

标签: objective-c uiview uiviewcontroller

我有控制器

#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

如何将有关得分的信息发送到用户界面并将其设置为标签?我希望UIView将此信息发送给控制器而不是控制器从UIView获取它。

1 个答案:

答案 0 :(得分:2)

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

因此,您有3种选择如何管理模型。请注意,在我的情况下,应用程序逻辑总是在控制器内部,因此是管理游戏和分数的控制器,而不是UI。

选择-1:严格的MVC

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


@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链路断开。

选择-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]];
}