#ios #swift #delegates
#iOS #swift #делегаты
Вопрос:
У меня есть класс SomeTextFieldClass , который является подклассом класса UITextField . Я использую его для настройки представления в представлении UITextField, и я также хотел бы использовать его для обработки ограничений на то, что вводит пользователь, например, пользователю разрешено вводить только числа с 2 десятичными знаками и т.д. Для этой цели я использую делегат UITextFieldDelegate textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
. Когда я проверяю self.delegate = self
во время инициализации моего SomeTextFieldClass , я могу заставить функциональность работать. Однако у меня сильное ощущение, что это создает цикл сохранения, и я хотел бы этого избежать. Есть ли какой-то другой способ, как это сделать? Какова наилучшая практика использования методов делегирования в самом классе? По сути, я просто хочу получить доступ к методам делегирования UITextField (например shouldChangeCharactersIn
) в самом дочернем классе UITextField. Спасибо
Ответ №1:
Делегаты «слабые» по своей природе. Следовательно, количество сохранений не увеличивается на 1 при назначении делегата. Следовательно, цикл сохранения не создается.
Проверьте это: https://medium.com/macoclock/delegate-retain-cycle-in-swift-4d9c813d0544
Комментарии:
1. Делегаты обычно слабые по соглашению, чтобы избежать циклов сохранения. Однако они не являются слабыми, если вы не сделаете их слабыми. Лучшим ответом было бы «По соглашению, вы должны сделать свои свойства делегата слабыми. Это позволяет избежать циклов сохранения. »
Ответ №2:
Я считаю, что вам следует настроить делегат как «текстовое поле.делегировать = self» в контроллере представления. Затем вы должны обработать это следующим образом;
extension UIViewController: SomeTextFieldClassDelegate {
// protocol functions are here
}
в SomeTextFieldClass делегат должен быть определен как «слабый»;
weak var delegate: SomeTextFieldClassDelegate?
Если вы предоставите больше кода, вы сможете получить лучшую помощь. Но похоже, что в этом коде что-то не так; «self.delegate = self» . Я предполагаю, что вы назначаете textfield своему собственному делегату.
Комментарии:
1. Ну, вот еще информация: я использую textfield IBOutlet как класс SomeTextField. В классе SomeTextField я установил еще несколько свойств представления текстового поля (cornerRadius, shadow и т. Д.) Причина, по которой я не хочу делать UIViewController делегатом, заключается в том, что, на мой взгляд, у меня есть около 15 IBOutlets класса SomeTextField, поэтому мне пришлось бы установить UIViewController в качестве делегата для каждого из них. Я подумал, что было бы более эффективно обрабатывать ограничения поведения SomeTextField внутри самого класса SomeTextField, получая доступ к методам самостоятельного делегирования.