self class alloc для контроллеров, эквивалентных в Swift - PullRequest
0 голосов
/ 13 сентября 2018

У меня был класс UIBaseClassViewController с удобными функциями в цели. Теперь я переключаюсь на swift и пытаюсь преобразовать его код в swift. Функция, вызывающая у меня проблему

+(UIBaseClassViewController*)getController
{
   return [[[self class] alloc] initWithNibName:NSStringFromClass([self class]) bundle:[NSBundle mainBundle]];
}

iбыл в состоянии преобразовать его, но он не работает нормально

static func getController() -> Self
{
    print("sam controller class = \(String(describing:self))")
    print("SAM controller = \(self.init(nibName: String(describing:self), bundle:Bundle.main))")

    return self.init(nibName: String(describing:self), bundle:Bundle.main)
}

Вывод:

sam controller class = UILoginViewController
SAM controller = <Swift_And_Node.UIBaseClassViewController: 0x7f8a4ee13830>

созданный объект имеет тип UIBaseClassViewController.it загружает перо нормально, но, поскольку объект имеет UIBaseClassViewController, происходит сбой приложенияпотому что он не смог найти функции в UIBaseClassViewController, которые находятся в UILoginViewController.

Как я могу заставить его создать объект дочернего класса вместо parent.UILoginViewController в этом случае

для лучшего понимания: добавление кода:

UIBaseClassViewController :

class UIBaseClassViewController: UIViewController {
static func getController() -> Self
{
    print("sam controller class = \(String(describing:self))")
    print("SAM controller = \(self.init(nibName: String(describing:self), bundle:Bundle.main))")
    var object = self
    return self.init(nibName: String(describing:self), bundle:Bundle.main)
}
}

UILoginViewController :

class UILoginViewController: UIBaseClassViewController {}

3-й контроллер, которому нужен UILoginViewController :

UILoginViewController.getController()

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Оказывается, нам не нужно упоминать nib и bundle для объекта контроллера ... Я перешел от цели c, и эти вещи необходимы там.

с

[[UILoginViewController alloc] init] 

приложение покажет черный экран.

В Swift мы можем просто использовать UILoginViewController (), и оно будет автоматически связывать nib с объектом контроллера.

поэтому, чтобы ответить на мой вопрос, я просто использовал

self.init()

вместо

self.init(nibName: String(describing:self), bundle:Bundle.main)
0 голосов
/ 13 сентября 2018

Вы должны либо вызывать эту статическую функцию в желаемом классе контроллера представления, либо вообще не делать ее статической. Пожалуйста, посмотрите пример ниже, чтобы увидеть, как это работает в Swift.

class ParentView: UIView {
    static func printSelf() {
        print(String(describing: self))
    }
}
class ChildView: ParentView {}

ParentView.printSelf() // Prints ParentView
ChildView.printSelf() // Prints ChildView
...