Swift Best Practice: Как отслеживать различные объекты? - PullRequest
0 голосов
/ 27 октября 2018

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

У меня есть эта функция:

private extension MenuButtonsViewController {
  // TODO: Find a way to find correct button based on MenuItem
  func buttonFor(for menuItem: MenuItem) -> EmojiButton? {
    guard let subViews = stackView.subviews as? [EmojiButton] else {
      return nil
    }
    let button = buttonFactory.makeEmojiButton(title: menuItem.icon)
    for subView in subViews where subView == button {
      return subView
    }
    return nil
  }
}

У меня есть массив (UIStackView) с различным количеством кнопок (EmojiButton). Кнопки создаются с контентом MenuItem. Я ищу хорошее и чистое решение, как найти и удалить определенную кнопку из массива stackView на основе MenuItem.

Пока у меня было три идеи:

  • Для создания нового объекта, инициализированного теми же значениями, что и удаляемого, а затем сопоставьте с помощью ==. (Решение выше). Это не сработало.
  • Чтобы добавить id ко всем кнопкам, а затем соответствующий id к объекту MenuItem. Но это не похоже на элегантное решение, чтобы добавлять его везде и выставлять эту переменную из объекта кнопки.
  • Возможно, сохраните кнопку в классе оболочки (например, MenuItemButton) с id для сопоставления или сохранением объекта MenuItem, чтобы я мог сопоставить его с этим.

Есть идеи? Как это обычно делается?

1 Ответ

0 голосов
/ 27 октября 2018

Если MenuItem и EmojiButton наследуются от UIView, вы можете использовать свойство tag, доступное для всех UIView.

Сначала вам нужно присвоить уникальное значение tag каждому из ваших MenuItem.

Затем вам нужно присвоить это же значение для свойства tag соответствующей кнопки Emoji.,(Это было бы хорошо сделать на вашем заводе.)

Сделав это, вы можете изменить свою функцию следующим образом:

//assumes MenuItem and EmojiButton inherit from UIView
func buttonFor(for menuItem: MenuItem) -> EmojiButton? {
    return stackView.viewWithTag(menuItem.tag) as? EmojiButton
}
...