Использование @objc в Swift 4 устарело, но что делать? - PullRequest
0 голосов
/ 03 июня 2018

Так как @objc устарела в Swift 4, я получаю новые сообщения об ошибках.Это один из них:

tableView: numberOfRowsInSection:] устарел и будет удален в Swift 4;добавьте явное '@objc' к объявлению, чтобы создать точку входа Objective-C в Swift 4 и подавить это сообщение

У меня немного поиск, и я нашел этот ответ: https://stackoverflow.com/a/44380886/9886916 -Но когда я изменяю Swift 3 @objc Inference на По умолчанию , приложение вылетает.Это из-за tableView строк, которые у меня есть.Они выглядят так:

func numberOfSectionsInTableView(_ tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return players.count
    }

    func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

        cell.gameLabel.text = self.players [indexPath.row]

        return cell
    }

    func tableView(_ tableView: UITableView, canEditRowAtIndexPath indexPath: IndexPath) -> Bool {
        return true
    }

    func tableView(_ tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: IndexPath) {
        if (editingStyle == UITableViewCellEditingStyle.delete) {

            players.remove(at: indexPath.row)

            self.tableView.reloadSections(IndexSet(integer: 0), with: UITableViewRowAnimation.automatic)
        }
    }

Приложение работает нормально, когда я использую @objc func ... и задаю Swift 3 @objc Inference в ON , но так как ононе рекомендуется, я думаю, я не должен этого делать?Любые советы или решения здесь?

РЕДАКТИРОВАТЬ: Это полное сообщение об ошибке:

* / Пользователи / Я / Документы / XCODE / Prosjekter / MyProject / MyProject / JHACategoriesController.swift: 116: 5: неявная точка входа Objective C - [MyProject.JHACategoriesController tableView: heightForFooterInSection:] устарела и будет удалена в Swift 4;добавьте явное '@objc' к объявлению, чтобы создать точку входа Objective-C в Swift 4 и подавить это сообщение Текущая трассировка стека: 0 libswiftCore.dylib
0x000000010ead0ff0 swift :: warning (unsigned int, char const *, ...) + 228 1 libswiftCore.dylib 0x000000010eb075b0 swift_objc_swift3ImplicitObjCEntrypoint + 514 2 MyProject
0x0000000106288d20 @objc JHACategoriesController.tableView (_ heightForFooterInSection :) + 84 3 UIKit 0x0000000109aebf53 - [UITableView _delegateWantsFooterForSection:] + 576 4 UIKit 0x0000000109db4414 - [UISectionRowData refreshWithSection: Tableview: tableViewRowData:] + 1 236 5 UIKit
0x0000000109db92f1 - [UITableViewRowData numberOfRows] + 95 6 UIKit 0x0000000109ad2d7e - [UITableView noteNumberOfRowsChanged] + 117 7
UIKit 0x0000000109ad1d3f - [UITableView reloadData] + +1354 8 MyProject
0x0000000106285ea0 JHACategoriesController.viewDidLoad () + 4879 9
MyProject 0x0000000106287210 @objc JHACategoriesController.viewDidLoad () + 36 10 UIKit
0x0000000109b3ecd2 - [UIViewController loadViewIfRequired] + 1215 11
UIKit 0x0000000109b3f5b9 - [вид UIViewController] + 27 12 UIKit 0x0000000109b708bd - [UINavigationController _startCustomTransition:] + 945 13 UIKit 0x0000000109b87318 - [UINavigationController _startDeferredTransitionIfNeeded:] + 714 14 UIKit 0x0000000109b88836 - [UINavigationController __viewWillLayoutSubviews] + 150 15 UIKit 0x0000000109de0af0 - [UILayoutContainerView layoutSubviews] + 231 16
UIKit 0x0000000109a6a21d - [UIView (CALayerDelegate) layoutSublayersOfLayer:] + 1515 17 QuartzCore 0x000000010947a569 - [CALayer layoutSublayers] + 177 18 QuartzCore
0x000000010947e6a0 СА:: Layer :: layout_if_needed (CA :: Transaction *) + 395 19 QuartzCore 0x0000000109405148 CA :: Context :: commit_transaction (CA :: Transaction *) + 343 20
QuartzCore 0x0000000109432708 CA :: Transaction :: commit () + 56821 UIKit
0x00000001099c3e7c _afterCACommitHandler + 272 22 CoreFoundation
0x000000010e31e5f0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 23 CoreFoundation 0x000000010e31e3b0 __CFRunLoopDoObservers + 430 24 CoreFoundation 0x000000010e302580 __CFRunLoopRun + 1537 25 CoreFoundation * +1042 * 0x000000010e302090 CFRunLoopRunSpecific + 635 26 GraphicsServices
0x000000010f9afa35 GSEventRunModal + 62 27 UIKit
0x000000010999b018 UIApplicationMain + 159 28 MyProject
0x00000001062baf10 main + 55 29 libdyld.dylib
0x000000011163c954 start + 1
/Users/Me/Documents/XCODE/MSystem/Cject/HjectJject.HjectJter.Chejter: 5: неявная точка входа Objective C - [MyProject.JHACategoriesController tableView: numberOfRowsInSection:] устарела и будет удалена в Swift 4;добавьте явное '@objc' к объявлению, чтобы создать точку входа Objective-C в Swift 4 и подавить это сообщение Текущая трассировка стека: 0 libswiftCore.dylib
0x000000010ead0ff0 swift :: warning (unsigned int, char const ,...) + 228 1 libswiftCore.dylib 0x000000010eb075b0 swift_objc_swift3ImplicitObjCEntrypoint + 514 2 MyProject
0x00000001062877b0 @objc JHACategoriesController.tableView (_ numberOfRowsInSection :) + 84 3
UIKit 0x0000000109b05813 - [UITableView _numberOfRowsInSection:] + 62 4 UIKit 0x0000000109db4414 -[UISectionRowData refreshWithSection: Tableview: tableViewRowData:] + 2631 5 UIKit
0x0000000109db92f1 - [UITableViewRowData numberOfRows] + 95 6 UIKit 0x0000000109ad2d7e - [UITableView noteNumberOfRowsChanged] + 117 7
UIKit 0x0000000109ad1d3f - [UITableView reloadData] + 1354 8 MyProject
0x0000000106285ea0 JHACategoriesController.viewDidLoad () + 4879 9
MyProject 0x0000000106287210 @objc JHACategoriesController.viewDidLoad () + 36 10 UIKit
0x0000000109b3ecd2 - [UIViewController loadViewIfRequired] + 1215 11
UIKit 0x0000000109b3f5b9 - [вид UIViewController] + 27 12 UIKit 0x0000000109b708bd - [UINavigationController _startCustomTransition:] + 945 13 UIKit 0x0000000109b87318 - [UINavigationController _startDeferredTransitionIfNeeded:] + 714 14 UIKit 0x0000000109b88836 - [UINavigationController * тысяча пятьдесят-девять * viewWillLayoutSubviews] + 150 15 UIKit 0x0000000109de0af0 - [UILayoutContainerView layoutSubviews] + 231 16
UIKit 0x0000000109a6a21d - [UIView (CALayerDelegate) layoutSublayersOfLayer:] + 1515 17 QuartzCore 0x000000010947a569 - [CALayer layoutSublayers] + 177 18 QuartzCore
0x000000010947e6a0 CA :: Layer :: layout_if_needed (CA :: Transaction *) + 395 19 QuartzCore 0x0000000109405148 CA :: Context :: commit_transaction (CA :: Transaction *) + 343 20
QuartzCore 0x0000000109432708 CA :: Transaction :: commit () + 568 21 UIKit
0x00000001099c3e7c _afterCACommitHandler + 272 22 CoreFoundation
0x000000010e31e5f0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23 23 CoreFoundation 0x000000010e31e3b0 __CFRunLoopDoObservers + 430 24 CoreFoundation 0x000000010e302580 __CFRunLoopRun + 1537 25 CoreFoundation
0x000000010e302090 CFRunLoopRunSpecific + 635 26 GraphicsServices
0x000000010f9afa35 GSEventRunModal + 62 27 UIKit * тысяча шестьдесят-восемь * 0x000000010999b018 UIApplicationMain + 159 28 MyProject
0x00000001062baf10 main + 55 29 libdyld.dylib
0x000000011163c954 start + 1 libc ++ abi.dylib: завершается с неперехваченным исключением типа NSException

1 Ответ

0 голосов
/ 03 июня 2018

Проблема, как правило, заключается в том, что вы не обновили сигнатуры методов.Например, у вас есть

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {


Это неправильно.Это должно быть

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


И так далее.Просто просмотрите все эти объявления в документации или заголовке и исправьте их в соответствии с обновленными сигнатурами.

Также убедитесь, что этот код находится либо в UITableViewController, либо в контроллере представления, который явно принимает UITableViewDataSource и UITableViewDelegate.

РЕДАКТИРОВАТЬ Вы опубликовали свой код (на https://pastebin.com/dxSM3SJw),, и он ясно показывает, что вы не сделали того, что я сказал. Хорошо, я собираюсь повторить все это.Пожалуйста, прочитайте внимательно то, что я говорю.

Ваше объявление контроллера представления:

class JHACategoriesController: UIViewController {

Это противоположно тому, что я сказал сделать. Я сказал:

Также убедитесь, что этот код находится либо в UITableViewController, либо в контроллере представления, который явно принимает UITableViewDataSource и UITableViewDelegate.

Вы не сделали этого. Сделайте это.Вам нужно, чтобы это объявление было:

class JHACategoriesController: UIViewController, UITableViewDelegate, UITableViewDataSource {


Затем необходимо исправить все методы делегата и источника данных, чтобы они были правильно обновлены.ature.Вы все еще этого не сделали.Например, код, который вы разместили в pastebin, имеет следующую декларацию:

func tableView(_ tableView: UITableView, numberOfSectionsInTableView indexPath: IndexPath) -> Int {


Это неправильно.Код, который вы разместили в своем вопросе, имеет другую подпись:

func numberOfSectionsInTableView(_ tableView: UITableView) -> Int {

Но это тоже неправильно.Правильная подпись:

func numberOfSections(in tableView: UITableView) -> Int {

Уверяю вас, что когда вы исправите их для всех методов делегата и источника данных, все ваши проблемы исчезнут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...