Xcode 10.2 с компилятором Swift 5.0 - проблема наследования протокола - PullRequest
21 голосов
/ 09 апреля 2019

У нас большая проблема с текущей версией Xcode (10.2).

Существует класс BasicViewController со следующей сигнатурой:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

Затем у нас есть другой класс, напримерExampleViewController: BasicViewController с некоторой дополнительной логикой.

Теперь самое сложное ...

Мы создаем и запускаем приложение на разных симуляторах и устройствах, и все работает правильно.Затем мы архивируем приложение, и внезапно didSelectRow больше не запускается.Глубокая чистота проекта позволила нам воспроизвести проблему без необходимости повторного архивирования.

Я не могу вспомнить ни одного случая, когда это могло произойти.И это становится еще хуже, потому что я обнаружил больше подобных проблем с методами UITableViewDelegate, которые не вызывались в дочернем классе только при запуске архивированного приложения.Может ли быть проблема с некоторыми оптимизациями во время архивирования и отправки приложения?

Я проверяю, что мы правильно установили dataSource и delegate таблицы, над таблицей нет распознавателей жестов.Та же логика хорошо работает после запуска приложения второй / третий раз, но не удается в первый раз после глубокой очистки проекта.

Мы сделали тест и установили UITableViewDataSource и UITableViewDelegate в дочернем классеи тогда он работает, как и ожидалось, каждый раз.Кажется, наследование протоколов не работает хорошо.Если мы сохраняем протоколы в родительском и добавляем их в дочерний класс, то в нем говорится, что протоколы в дочернем классе являются избыточными.

Кто-нибудь испытывал что-либо подобное?Любые предложения приветствуются.

Ответы [ 3 ]

15 голосов
/ 09 апреля 2019

Возможно, вы используете https://bugs.swift.org/browse/SR-10257 в компиляторе Swift 5.0. Это произойдет, если у вас есть как минимум три файла:

  1. BasicViewController.swift
  2. SomeOtherFile.swift
  3. ExampleViewController.swift

Если SomeOtherFile.swift делает какие-либо вызовы для значения AnyObject, вы компилируете в режиме wholemodule, и файлы передаются компилятору в указанном выше порядке (с SomeOtherFile.swift в середине два), то кажется, что компилятор не может правильно вывести @objc -ness для реализации func tableView(_:, didSelectRowAt:). Вы можете обойти это, явно пометив его @objc.

2 голосов
/ 09 апреля 2019

Я столкнулся с той же проблемой.Я исправил это, добавив методы непосредственно в мой основной класс, и переопределил их в других классах.Теперь все вызывается правильно.

0 голосов
/ 09 апреля 2019

Вы должны приложить dataSource и delegate к обеим сторонам, используя Storyboard, а также класс, потому что, как только у меня возникла та же проблема с табличным представлением, и это было из-за того, что в классе я не сделал

self.tableView.delegate = self
self.tableView.datasource = self

Я думаю, что вы делаете не так.

Я знаю, что нет необходимости использовать оба стиля, но иногда нам это нужно.посмотрите на этот ответ https://stackoverflow.com/a/39443079/3485420

...