Общий класс для подклассов UIViewControllers? - PullRequest
1 голос
/ 29 апреля 2019

У меня есть сценарий раскрутки в каком-то устаревшем коде, который имеет слишком много дублирования.Я пытаюсь сократить его.

- (IBAction)unwindWithNewData:(UIStoryboardSegue *)segue {
    if ([segue.sourceViewController isKindOfClass:DistantVC1.class]) {
        DistantVC1 *sourceVC = (DistantVC1 *)segue.sourceViewController;
        self.activeUUID = sourceVC.data.uuid;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC2.class]) {
        DistantVC2 *sourceVC = (DistantVC2 *)segue.sourceViewController;
        self.activeUUID = sourceVC.data.uuid;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC3.class]) {
       DistantVC3 *sourceVC = (DistantVC3 *)segue.sourceViewController;
       self.activeUUID = sourceVC.data.uuid;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC4.class]) {
        DistantVC4 *sourceVC = (DistantVC4 *)segue.sourceViewController;
        self.activeUUID = sourceVC.data.uuid;
    }
}

Я бы хотел сохранить обобщенную версию любого viewcontroller в верхней части функции и просто заполнить ее соответствующей, а затем вызвать self.установщик activeUUID один раз.Что-то вроде:

- (IBAction)unwindWithNewData:(UIStoryboardSegue *)segue {
    id sourceVC;
    if ([segue.sourceViewController isKindOfClass:DistantVC1.class]) {
        sourceVC = (DistantVC1 *)segue.sourceViewController;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC2.class]) {
        sourceVC = (DistantVC2 *)segue.sourceViewController;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC3.class]) {
       sourceVC = (DistantVC3 *)segue.sourceViewController;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC4.class]) {
       sourceVC = (DistantVC4 *)segue.sourceViewController;
    }
    self.activeUUID = sourceVC.data.uuid;
}

Есть идеи?Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Да, согласно комментарию использовать протокол.

  @protocol ActiveIdProvider
  @property NSString *activeUUID
  @end


  @interface DistantVC1 : UIViewController <ActiveIdProvider> //repeat this block for each DistantVC class you have
  @property NSString *activeUUID
  @end
- (IBAction)unwindWithNewData:(UIStoryboardSegue *)segue {
    ActiveIdProvider *sourceVC;
    if ([segue.sourceViewController isKindOfClass:DistantVC1.class]) {
        sourceVC = (DistantVC1 *)segue.sourceViewController;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC2.class]) {
        sourceVC = (DistantVC2 *)segue.sourceViewController;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC3.class]) {
       sourceVC = (DistantVC3 *)segue.sourceViewController;

    } else if ([segue.sourceViewController isKindOfClass:DistantVC4.class]) {
       sourceVC = (DistantVC4 *)segue.sourceViewController;
    }
    self.activeUUID = sourceVC.data.uuid;
}
0 голосов
/ 02 мая 2019

А вот версия Swift 4.2:

protocol ActiveIDProvider {
    var activeUUID: String { get }
}

class myVC1: UIViewController { }

extension myVC1: ActiveIDProvider {
    var activeUUID: String {
        get {
            return "1"
        }
    }
}
    @IBAction func unwindWithNewData(_ segue: UIStoryboardSegue) {
        var sourceVC: ActiveIDProvider

        if segue.source.isKind(of: myVC1.self) {
            sourceVC = segue.source as! myVC1
        } else if segue.source.isKind(of: myVC2.self) {
            sourceVC = segue.source as! myVC2
        } else if segue.source.isKind(of: myVC3.self) {
            sourceVC = segue.source as! myVC3
        } else if segue.source.isKind(of: myVC4.self) {
            sourceVC = segue.source as! myVC4
        }

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