当我调用drawRect时,UIView类属性似乎消失了:

时间:2014-11-23 23:16:38

标签: objective-c uiview uiviewcontroller drawrect iboutlet

我正在用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。到目前为止,没有任何工作。

1 个答案:

答案 0 :(得分:0)

这是一个讨厌的人!

我认为你有2个PlayingCardView实例:

  1. 您的视图已连接到Interface Builder中的IBOutlet
  2. 您在IB中的(相同)视图/因为您尚未将类设置为PlayingCardView。
  3. 因此,当从IB加载而不是在&#34;出口时,您的IB中的PlayingCardView实际上正在发生drawRect调用。查看你在哪里设置排名和诉讼。

    我猜你可能已经手动编写了IBOutlet行,而不是进行拖动。

    检查Interface builder中的PlayingCardView视图是否将其类设置为PlayingCardView。

    然后跑。

    如果仍然无效,则从代码和视图检查器中删除IBOutlet行(非常重要),然后再将其拖到PlayCardGameViewController.h

相关问题