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です。コントローラーは BallsViewController で、アプリのロジックが含まれています。モデルはスコアである必要があります。

したがって、モデルの管理方法には 3 つの選択肢があります。私の場合、アプリのロジックは常にコントローラー内にあることに注意してください。コントローラーは、UI ではなく、ゲームとスコアを管理します。

Choice-1 : 厳密な MVC

スコアは独立したオブジェクトとしてモデル化されます。このような場合、「Score」クラスを定義し、コントローラーからモデルにスコアの更新を送信し、ビューがモデルの変更をリッスンできるようにします。


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

次に、コントローラはオブジェクト スコアをインスタンス化します。


Score *myScore;

スコアリング イベントが発生したときに更新します。


[myScore setPoints:30];

最後に、KVO を使用して、ViewBoard が myScore の「ポイント」プロパティの変更をリッスンできるようにします。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 : モデルがビュー内にある このアプローチは単純ですが、通常は推奨されません。通常、コントローラーとビュー表現の間に強い依存関係を追加したくないためです (これは、ビューの要件がビューの表示方法に影響を与える可能性があるためです)。ビューコントローラーはそのロジックを更新します)。また、ビューのアンロード イベントでスコアを失う可能性があるという制限もあります。このような場合、ポイント プロパティをビューに追加します。


@property (nonatomic,assign) NSInteger points;

ビューコントローラーでは、次の方法でポイントを変更できます。


[self.viewBoards setPoints:30];

最後に、ビューの「setPoints:」セッターには「更新」ロジックが含まれます。


-(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 に答える