Искаженное исключение при реализации подкласса UIPopoverBackgroundView - PullRequest
4 голосов
/ 02 февраля 2012

Я реализовал этот класс следующим образом:

#import "JKBackgroundView.h"

@implementation JKBackgroundView

static CGFloat jkArrowBase = 26.0;
static CGFloat jkArrowHeight = 16.0;

// Background image insets
static CGFloat jkBackgroundTopInset = 68.0f;
static CGFloat jkBackgroundLeftInset = 16.0f;
static CGFloat jkBackgroundBottomInset = 16.0f;
static CGFloat jkBackgroundRightInset = 34.0f;

// Content view insets
static CGFloat jkContentTopInset = 40.0f;
static CGFloat jkContentLeftInset = 6.0f;
static CGFloat jkContentBottomInset = 8.0f;
static CGFloat jkContentRightInset = 7.0f;

+(CGFloat)arrowBase {
    return jkArrowBase;
}

-(UIPopoverArrowDirection)arrowDirection {
    return UIPopoverArrowDirectionUp;
}

-(CGFloat)arrowOffset {
    return 0.0f;
}

+(CGFloat)arrowHeight {
    return jkArrowHeight;
}

+(UIEdgeInsets)contentViewInsets {
    return UIEdgeInsetsMake(jkContentTopInset, jkContentLeftInset, jkContentBottomInset, jkContentRightInset);
}

-(void)drawRect:(CGRect)rect {
    UIEdgeInsets popoverInsets = UIEdgeInsetsMake(jkBackgroundTopInset, jkBackgroundLeftInset, jkBackgroundBottomInset, jkBackgroundRightInset);
    UIImage *popoverImage = [[UIImage imageNamed:@"popover_stretchable.png"] resizableImageWithCapInsets:popoverInsets];
    [popoverImage drawInRect:rect];
}

-(id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

-(void)setArrowDirection:(UIPopoverArrowDirection)arrowDirection {
    // Do nothing
}

@end

Я добавляю его в свой UIPopoverView (не подкласс), используя этот код:

_logoutPopover.popoverBackgroundViewClass = [JKBackgroundView class];

Когда я запускаю проектТем не менее я получаю сумасшедшее сообщение об ошибке:

* Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: '- [UIPopoverBackgroundView º¯lå] должно бытьреализовано субклассерами. '

Кто-нибудь имеет представление, какой метод, по его мнению, я не реализовал?Кажется, это просто кучка тарабарщины.Спасибо!

Редактировать Похоже, я забыл реализовать setArrowOffset :.Это работает после добавления этого.Сообщение об ошибке Apple было просто искажено.

1 Ответ

3 голосов
/ 02 февраля 2012

В соответствии с документами для UIPopoverBackgroundView вам также необходимо реализовать установщики для свойств в UIPopoverBackgroundView (т.е. arrowDirection и arrowOffset.). Вы только что получили геттеры в своей реализации.

...