2015-07-28 3 views
0

У меня есть пользовательский UItextView подкласс, где я переопределить canBecomeFirstResponder():Лениво Override Properties IBOutlet Объекта

class MyTextView: UITextView { 

    /* 
    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) { 
     // Drawing code 
    } 
    */ 

    override func canBecomeFirstResponder() -> Bool { 
     return false 
    } 

} 

Я делаю это, чтобы данные обнаружены ссылки (номера телефонов URL-адреса) в UITextView функционировать без каких-либо другого текста в представлении, который можно выбрать, но это не связано с вопросом.

canBecomeFirstResponder() - это единственное свойство/метод, который я хочу переопределить, поэтому подклассы кажутся излишними. Я использую этот пользовательский класс с представлением, созданным с помощью Interface Builder. Можно ли лениво переопределить свойства IBOutlet свойств объекта UIKit? Что-то вроде этого:

@IBOutlet weak var contactTextView: UITextView! { 
    override func canBecomeFirstResponder: Bool = { 
     return false 
    } 
} 

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

+1

Я уже могу добиться ожидаемого поведения путем подкласса, я ищу лучший способ. Отсюда этот вопрос. – JAL

+0

Если вы вернете false для canBecomeFirstResponder, вы даже не сможете использовать свои URL-адреса в любом случае. –

+0

@NateLee Не правда, я тестировал это сегодня, и я могу использовать URL-адреса без выбора текста в 'UITextView', который является моим желаемым поведением. События касания на ссылках выше в цепочке «UIResponder», чем выбор текста. – JAL

ответ

6

Если вы хотите переопределить, то вы найдете для подкласса. Эти два понятия связаны между собой. Вы не можете переопределить без подкласса.

Ваша идея «как эта» не будет работать на любом языке. В принципе, вы описываете анонимный подкласс, который доступен на Java, например (не в Swift). Однако это должно было бы использоваться во время создания экземпляра класса, а не при объявлении переменной.

Конечно, вы могли бы swizzle canBecomeFirstResponder способом, возвращающим false в didSet, но это намного сложнее, чем подклассы.

+0

Благодарим вас за ответ. Поэтому вы говорите, что лучший/самый простой способ достичь моего желаемого поведения - это подкласс. Нет более простых альтернатив. – JAL

+0

@JAL Я пытался найти способ заблокировать выбор и сохранить URL-адреса для клики без переопределения, но переопределение кажется единственным способом сделать это. И overriding = subclassing. – Sulthan

0

Ответ на этот вопрос заключается в том, что с текущими версиями swift нет никакого способа сделать это.

Основываясь на том, что вы описываете, возможно, вы можете сделать свой контроллер представления UITextViewDelegate и реализовать textViewShouldBeginEditing для возврата false. Это просто предположение, основанное на том, что вы, похоже, пытаетесь переопределить canBecomeFirstResponder, чтобы запретить печатать.

Что все сказано, как было указано, если вы вернете false из canBecomeFirstResponder Я думаю, что ожидаемое поведение заключается в том, что элемент пользовательского интерфейса больше не позволит себе захватить ввод пользователя. Из ваших ответов в комментариях кажется, что его захват пользователя для вас в любом случае, но это может быть только конкретная версия iOS, в которой вы работаете. Возможно также, что мое понимание первой цепи ответчиков неверно.

+0

Я не пытаюсь запретить печатать. Я пытаюсь запретить выбор текста и действия copy/define. Я тестировал поведение на iOS 8 и 9, поэтому не уверен, что я что-то упустил. – JAL

Смежные вопросы