Shahbaz Akram
Shahbaz Akram

Reputation: 1657

Argument of '#selector' does not refer to an initializer or method in

I update my project from Swift2.2 to Swift3.0 But "Argument of '#selector' does not refer to an initializer or method" issue received.

Here is code :

for object in Students {
    let sectionNumber = collation.section(for: object.firstName!, collationStringSelector: #selector(NSObjectProtocol.self))
    sections[sections.count - 1 - sectionNumber].append(object)
}

enter image description here

Upvotes: 0

Views: 2412

Answers (3)

Shahbaz Akram
Shahbaz Akram

Reputation: 1657

I implement user2215977 answer but app crash again & again. Now i just change the #selector(NSObjectProtocol.self) to "self". All error gone but just one warning received " Use of string literal for Objective-C selectors is deprecated; use #selector instead ".

If any person have idea to resolve this warning then share me.Otherwise error go now.

Upvotes: 0

Morty Choi
Morty Choi

Reputation: 2540

class Person: NSObject {
    @objc var name: String

    init(name: String) {
        self.name = name
    }
}

let p = Person(name: "Alice")

let collation = UILocalizedIndexedCollation.current()
collation.section(for: p, collationStringSelector: #selector(getter: Person.name))

This is also fine since Selector is from Objective-C. Which we need to :NSObject and @objc.

Upvotes: 3

Qadir Hussain
Qadir Hussain

Reputation: 8856

As per docs

func section(for object: Any, collationStringSelector selector: selector) -> Int

Description 
Returns an integer identifying the section in which a model object belongs.
The table-view controller should iterate through all model objects for the table view and call this method for each object. If the application provides a Localizable.strings file for the current language preference, the indexed-collation object localizes each string returned by the method identified by selector. It uses this localized name when collating titles. The controller should use the returned integer to identify a local “section” array in which it should insert object.

Parameters  
object
A model object of the application that is part of the data model for the table view.

*selector*
A selector that identifies a method returning an identifying string for object that is used in collation. The method should take no arguments and return an NSString object. For example, this could be a name property on the object.

Returns 
An integer that identifies the section in which the model object belongs. The numbers returned indicate a sequential ordering.

Solution

Change like below

collation.section(for: "test", collationStringSelector: #selector(getStr)) //here getStr is an other function returning String



func getStr()->String{
        return "test"; // this should return an identifying string for object that is used in your collation
}

Upvotes: 0

Related Questions