1.附上代码先
#import "CardGameViewController.h"
@interface CardGameViewController ()
@property (weak, nonatomic) IBOutlet UILabel *clickCountLabel;
@property (nonatomic) int countOfClick;
@end
@implementation CardGameViewController
-(void) setCountOfClick:(int)countOfClick
{
_countOfClick=countOfClick;
self.clickCountLabel.text= [NSString stringWithFormat:@"you have clicked %d times",self.countOfClick];
}
- (IBAction)countOfClickPlusOne:(UIButton *)sender {
self.countOfClick++;
}
@end
看完斯坦福大学的视频,稍微简化了一下,写出了这段代码。首先是view和view controller的链接,button是直接把响应事件函数拖过来,label是拖到interface的那个地方,自动生成property.
那么,如何让label对button的click 事件进行响应呢?
答案是通过property中的setter来设置。countOfClick只是变量名,而真正的实例变量名是_countOfClick.而在这里重写 setter之后,除了要把原来setter的功能保持住之外,
还需要把label的text和countOfClick这个属性链接起来。
(有一个小细节需要注意,就是view和controller链接完了之后,不可以直接重命名方法,需要解除链接之后,再拖一遍)
(还有一个小细节要注意,IBOutlet和IBAction都相当于void,编译器会直接把这两个syntax翻译成void,所以无需烦恼)
现在就有一个疑问,为什么只要设置setter之后,点击按钮,label就直接发生变化了呢?
梳理一遍流程,点击按钮->countOfClick增加1->。。。
明白了,因为countOfClick是同时调用了setter和getter这两个方法,也就是点击按钮的时候,其实self.countOfClick++这句话已经自动调用了setter.
还有第二个疑问,如果不直接拖动,而在相应的地方写上同样的代码,算不算是把view和controller链接起来了呢,试试先。
如果直接写方法,代码左边表示链接的圆圈会变成空心的,鼠标移动过去也没有显示,所以不可以,还是要拖动。