BarButtonItem с закрытием перестает работать без причиныIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 BarButtonItem с закрытием перестает работать без причины

Сообщение Anonymous »

Следующая проблема возникает в Xcode 16.2, iOS18 SDK с целевой сборкой iOS17
У меня есть расширение для UIBarButtonItem для поддержки замыканий вместо цели/действия:

Код: Выделить всё

extension UIBarButtonItem {
typealias Closure = () -> Void

private class UIBarButtonItemClosureWrapper: NSObject {
let closure: Closure
init(_ closure: @escaping Closure) {
self.closure = closure
}

deinit {
print("DEINIT")
}
}

private enum AssociatedKeys {
static var targetClosure = 1
}

convenience init(title: String?, style: UIBarButtonItem.Style, closure: @escaping Closure) {
self.init(title: title, style: style, target: nil, action: #selector(closureAction))
objc_setAssociatedObject(self, &AssociatedKeys.targetClosure, UIBarButtonItemClosureWrapper(closure), objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}

convenience init(image: UIImage?, style: UIBarButtonItem.Style, closure: @escaping Closure) {
self.init(image: image, style: style, target: nil, action: #selector(closureAction))
objc_setAssociatedObject(self, &AssociatedKeys.targetClosure, UIBarButtonItemClosureWrapper(closure), objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}

@objc
func closureAction() {
guard let closureWrapper = objc_getAssociatedObject(self, &AssociatedKeys.targetClosure) as? UIBarButtonItemClosureWrapper else { return }
closureWrapper.closure()
}
}

Однако происходит что-то действительно странное, и я не знаю почему.
Я использую это в UIViewController в NavigationItem.rightBarButtonItems , и этот контроллер представления является корневым контроллером представления UINavigationController. Все работает нормально, пока я не добавлю TextField в представление SwiftUI, которое содержится в дочернем контроллере представления UIHostingController этого viewcontroller.
Итак, вкратце:

Код: Выделить всё

UINavigationController -> UIViewController -> UIHostingController -> TextField
Как только я передаю фокус TextField, кнопка больше не работает. Вы можете видеть, что он становится полупрозрачным, когда вы касаетесь его (поэтому он регистрирует касание), но замыкание больше не вызывается. Если я помещу рядом с ним кнопку, использующую стандартную систему целей/действий, она продолжит работать.
Это код UIViewController:

Код: Выделить всё

    override func viewDidLoad() {
super.viewDidLoad()

let item = UIBarButtonItem(title: "TargetAction", style: .done, target: self, action: #selector(buttonTapped))
let item2 = UIBarButtonItem(title: "ClosureAction", style: .done) {
print("CLOSURE TEST")
}
self.navigationItem.rightBarButtonItems = [item, item2]
}

@objc func buttonTapped() {
print("TARGET TEST")
}

а это код просмотра:

Код: Выделить всё

struct MyView: View {

var body: some View {
Form {
TextField("name", text: .constant("text"))
}
}

Код: Выделить всё

Target Test
печатается каждый раз, когда я нажимаю на кнопку. Тест закрытия печатается, когда я нажимаю другую кнопку, пока я не сфокусирую TextField, нажав на него. С этого момента Target Test по-прежнему работает, но Closure Test больше не печатается.
Выполняет ли фокус TextField и внешний вид клавиатуры что-то с панелью навигации? за кулисами, о которых я не знаю, тем самым каким-то образом уничтожая связанные объекты? Deinit никогда не выводится, а установка точки останова в ClosureAction показывает, что функция также не вызывается.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -no-reason
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • BarButtonItem с закрытием перестает работать без причины
    Anonymous » » в форуме IOS
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Pandas представляет терминаторы строк через to_csv без причины или причины
    Anonymous » » в форуме Python
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Pandas представляет терминаторы строк через to_csv без причины или причины
    Anonymous » » в форуме Linux
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Вставить значок в панель навигации / сделать BarButtonItem недоступным для кликов Swift iOS
    Гость » » в форуме IOS
    0 Ответы
    18 Просмотры
    Последнее сообщение Гость
  • Вставить значок в панель навигации / сделать BarButtonItem недоступным для кликов Swift iOS
    Гость » » в форуме IOS
    0 Ответы
    19 Просмотры
    Последнее сообщение Гость

Вернуться в «IOS»