нераспознанный селектор, отправленный экземпляру после миграции Swift 4.2 - PullRequest
0 голосов
/ 04 марта 2020

Я только что перенес свой проект из Swift 3.0 в Swift 4.2, и я начал получать эту ошибку.

Этот же метод вызывается из нескольких классов, но только один вызывает исключение. Есть идеи, что могло измениться в одном классе во время миграции Swift, что может быть причиной этой проблемы?

2020-03-04 09: 53: 42.552405-0500 Lake Observer [13974: 1234549] - [Lake_Observer. причина: '- [Lake_Observer.LocationChangeController reusablePickerViewController: didChooseValue: forCtrl:]: нераспознанный селектор, отправленный экземпляру 0x1040ca800'

Здесь происходит исключение. (RecorderReusablePicker)

- (void) buttonIsPressed:(UIButton *)paramSender{

        NSMutableArray *retArray = [[NSMutableArray alloc] initWithCapacity:array.count];
        for (int i = 0; i < array.count; i++) {
            [retArray addObject:[NSNumber numberWithInteger:[genericPicker selectedRowInComponent:i]]];
        }
        [callingReference reusablePickerViewController:self didChooseValue:[[RecorderReusableResult alloc] initWithArray:retArray clearValue:NO] forCtrl:callingControlReference];
}

Пикер создается здесь. (LocationChangeController)

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

    if (textField == editTextWaterBody) {
        let waterbodyArray: NSArray? = NSArray(objects: waterbodyNames)
        self.view.window?.rootViewController?.present(RecorderReusablePicker (dataArray: waterbodyArray as? [Any], widthArray: nil, inInitialIndexArray: [savedWaterbodyIndex], reference: self, andControlRef: editTextWaterBody, andTitle: "Please select your waterbody", showSelection: true, allowPanZoom: false), animated: true, completion: nil)
        return false
    }

    return true
}

И метод при возврате из сборщика.

func reusablePickerViewController(_ reusablePickerViewController: RecorderReusablePicker!, didChooseValue retVal: RecorderReusableResult!, forCtrl outCtrl: Any!) {
    reusablePickerViewController.dismiss(animated: true, completion: nil)
}

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

1 Ответ

1 голос
/ 04 марта 2020

Изменить

func reusablePickerViewController

на

@objc func reusablePickerViewController

Миграция со Swift 3 на Swift 4.2 изменила правила того, как члены экземпляра подвергаются Objective- C. В Swift 3 они были выставлены по умолчанию. В Swift 4.2 вы должны явно их выставить; в противном случае Объектив- C не может их видеть - именно это и происходит с вами. Метод есть, но Objective- C считает, что это не так, поэтому происходит сбой с исключением из-за нераспознанного селектора.

...