Изменить текст метки при выборе UICollectionViewCell - PullRequest
0 голосов
/ 19 октября 2018

У меня есть класс, в котором я определяю CollectionView, который я использую как пользовательский TabBar.В нем три ячейки, каждая из которых представляет другую вкладку.Когда я выбираю вкладку (которая, таким образом, является ячейкой CollectionView), я хочу обновить текст метки в моем представлении.

В tabs.swift (где происходит вся магия для настройки пользовательскихTabbar), я добавил следующую функцию:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let uvController = UserViewController()
    uvController.longLabel.text = "Test"

}

В UserViewController я называю это так:

let ProfileTabs: profileTabs = {

    let tabs = profileTabs()
    return tabs

}()

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

print(uvController.longLabel.text)

Это возвращает значение, которое я определил при настройке метки, так что я могу фактически получить доступ к метке, ноон не обновляется так, как я хочу.Любое понимание того, почему этого не происходит?

Ответы [ 2 ]

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

Эта строка - let uvController = UserViewController() создает новый экземпляр UserViewController, которого нет на экране.Вам нужно сослаться на уже показанный пользователю.Вы можете сделать что-то вроде этого:

  1. Самый быстрый способ.Просто передайте экземпляр в ProfileTabs инициализаторе.Примерно так:

    class ProfileTabs {
        let parentViewController: UserViewController
    
        init(withParent parent: UserViewController) {
            self.parentViewController = parent
        }
    
        // and then change to :
       func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
            parentViewController.longLabel.text = "Test"
    
        }
    }
    
  2. Более чистый путь.Используйте делегатов.

    protocol ProfileTabsDelegate: class {
        func profileTabs(didSelectTab atIndex: Int)
    }
    
    class ProfileTabs {
        weak var delegate: ProfileTabsDelegate?
    
        init(withDelegate delegate: ProfileTabsDelegate) {
            self.delegate = delegate
        }
    
        // and then change to :
       func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            delegate?.profileTabs(didSelectTab: indexPath.item)
    
        }
    }
    

    А затем в UserViewController

    extension UserViewController: ProfileTabsDelegate {
        func profileTabs(didSelectTab atIndex: Int) {
            longLabel.text = "Test"
        }
    }
    
0 голосов
/ 19 октября 2018
let uvController = UserViewController()

Эта строка является проблемой.

Вы создаете новый UserViewController вместо ссылки на текущий UserViewController, так что метка не совпадает.Вы можете распечатать (UserViewController), чтобы проверить его, адрес должен быть другим.

Я предлагаю вам определить протокол в Tabs.swift и сделать свой UserViewController его делегатом для получения действия обновления.

В то же время, let ProfileTabs: profileTabs также не является хорошим соглашением об именах, обычно пользовательский класс должен быть заглавной буквой вместо переменной.

...