2013-03-01 3 views
0

Я работаю над проектом доступности для приложения iOS. Поскольку доступность не действует так, как рекламируется, я должен переопределить accessibilityFrame, accessibilityActivationPoint и pointInside:withEvent в подклассе, чтобы расширить область, распознанную VoiceOver (как для рисования, так и для распознавания касания) за пределами «естественных» границ вида управления. Итак, чтобы изменить границы VoiceOver UIButton, я должен подклассифицировать этот класс, а затем добавить эти три метода. Чтобы сделать это для UILabel, я должен добавить еще один подкласс с кодом и так далее.Может ли подкласс B (который наследует от класса A) наследовать от подкласса A вместо самого A?

Я могу реорганизовать код в этих методах в центральное место, но мне было интересно, можно ли это сделать более элегантно с наследованием. Я хотел бы поместить этот код в подкласс UIView (возможно, называется UIViewAccessible), а затем создать подкласс UIButton под названием UIButtonAccessible, который наследует от UIButton, который в свою очередь наследует от UIViewAccessible вместо UIView. Возможно ли это, или что-то подобное можно сделать с категорией?

Edit: Согласно документации, вы не можете действительно достичь этого с категорией:

Если имя метода, объявленного в категории такой же, как метод в исходном классе , или метод в другой категории того же класса (или даже суперкласс), поведение не определено в отношении того, какой метод реализации используется во время выполнения.

Есть ли другой способ сделать это?

+0

Это не может быть сделано, как вы описываете, поскольку Objective-C не поддерживает множественное наследование. – rmaddy

+1

Возможно ли использовать swizzling и/или категории для переопределения реализаций фреймворка с помощью собственного? –

+0

Хмм, я не очень часто использую категории, но я всегда воспринимал их как способ добавления новых методов в существующий (возможно, закрытый) класс. Я не знал, что они могут также переопределить существующие методы в классе, если они действительно могут. Если это так, то я думаю, что моя задача может быть смехотворно легкой, так как я могу просто добавить эти три метода в категорию «UIView», и тогда мне даже не придется подклассифицировать что-либо еще. – MusiGenesis

ответ

2

Чтобы ответить на ваш вопрос, нет, он не может, так как ваш UIViewAccessible является вторым братом степени до UIButton в цепочке наследования (оба наследуют от UIView в какой-то момент). Но я думаю, вы уже это знали. Что касается решения, вы можете обернуть вокруг своих UIView доступных классов декоратора и использовать протоколы для сильной печати. Таким образом, вы сохраните код в одном месте. Я описал эту технику here более подробно (хотя для другой цели это та же ситуация).

Для представлений, которые будут поддерживать доступность вы должны сделать это:

@property (nonatomic, strong) UIView<MyAccesibilityProtocol>* view; 

//self.view can come from the nib or previously created in code 
self.view = [[AccesibilityDecorator alloc] initWithDecoratedObject:self.view]; 

//you can then use self.view like any other UIView, 
//and because it also implements an 
//accessibility protocol, you can use the methods 
//implemented in the wrapper as well. 
//more than that, you can control which methods to override 
//in the AccesibilityDecorator class 
[self.view addSubview:otherView];//could be overridden or not 
[self.view myAccesibilityMethod];//custom method declared in the protocol 
Смежные вопросы