我正在用xcode编写一个Objective-c项目。
我有两个正在使用的重要文件:viewcontroller和一个视图。 我的观点是class" PlayingCardView",我的viewcontroller是类:" PlayingCardGameViewController"。
这就是PlayingCardView.h的样子:
#import <UIKit/UIKit.h>
@interface PlayingCardView : UIView
@property (nonatomic) NSUInteger rank;
@property (strong, nonatomic) NSString *suit;
@property (nonatomic) BOOL faceUp;
@end
以下是PlayingCardView.m的重要代码:
#import "PlayingCardView.h"
@implementation PlayingCardView
-(void)setSuit:(NSString *)suit {
NSLog(@"suit is set");
_suit = suit;
[self setNeedsDisplay];
}
-(void)setRank:(NSUInteger)rank {
NSLog(@"rank is set");
_rank = rank;
[self setNeedsDisplay];
}
-(void)setFaceUp:(BOOL)faceUp {
_faceUp = faceUp;
[self setNeedsDisplay];
}
-(NSString *)rankAsString {
return @[@"?",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K",@"A"][self.rank];
}
- (void)drawRect:(CGRect)rect {
NSLog(@"Calling drawRect");
NSLog(@"%@%@",[self rankAsString],self.suit);
// Drawing Code
}
@end
这就是PlayingCardGameViewController.m的样子:
#import "PlayingCardGameViewController.h"
@interface PlayingCardGameViewController ()
@property (weak, nonatomic) IBOutlet PlayingCardView *playingCardView;
@end
@implementation PlayingCardGameViewController
-(void)viewDidLoad {
NSLog(@"Calling view did load");
[super viewDidLoad];
self.playingCardView.suit = @"♥︎";
self.playingCardView.rank = 13;
}
@end
我包含了一些NSLog,以查看所调用的内容的顺序以及发生的情况。这是打印出来的:
CardMatchingGame_Assignment04 [87470:3734148]调用视图确实已加载 CardMatchingGame_Assignment04 [87470:3734148]套装 CardMatchingGame_Assignment04 [87470:3734148]排名已设定 CardMatchingGame_Assignment04 [87470:3734148]调用drawRect CardMatchingGame_Assignment04 [87470:3734148]?(null)
基本上这告诉我的是第一个调用viewDidLoad。设置套装和等级,因为它们在viewDidLoad中设置。然后调用drawRect。现在当我要求返回套装和排名时,我得到一个空字符串和一个0值整数。我不知道发生了什么,但它出现在viewDidLoad和drawRect之间,属性正在丢失。
请帮助我,我对objective-c和xcode很新!非常感谢所有建议。
编辑:所以我试图做一些人们建议的事情,但没有解决问题。以下是一些附加信息:界面构建器中的PlayingCardView视图设置为类PlayingCardView。我尝试删除IBOutlet行并执行另一个ctl + drag来重新创建IBOutlet。到目前为止,没有任何工作。
答案 0 :(得分:0)
这是一个讨厌的人!
我认为你有2个PlayingCardView实例:
因此,当从IB加载而不是在&#34;出口时,您的IB中的PlayingCardView实际上正在发生drawRect调用。查看你在哪里设置排名和诉讼。
我猜你可能已经手动编写了IBOutlet行,而不是进行拖动。
检查Interface builder中的PlayingCardView视图是否将其类设置为PlayingCardView。
然后跑。
如果仍然无效,则从代码和视图检查器中删除IBOutlet行(非常重要),然后再将其拖到PlayCardGameViewController.h