Создание пользовательских UIView или дочерних VC - PullRequest
0 голосов
/ 23 марта 2020

Итак, у меня есть следующий случай. Я получил пользовательский макет вкладки, ie горизонтальный UIScollview с подкачкой страниц. На каждой странице есть несколько элементов управления и UITablev ie, «связки» в пользовательском UIView.

Я создаю ContainerV C, у которого есть scrollview, а затем инициализирую два UIViews и добавляю их как subviews в ContainerV C. Для этого я создал пользовательский класс UIView и установил этот UIView в качестве владельца файла .xib. Я также добавляю класс .xib в качестве своего пользовательского UIView.

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

Bundle.main.loadNibNamed(kCONTENT_XIB_NAME, owner: self, options: nil)

, а затем устанавливаю для UITableViewDelegate и UITableViewDateSource значение self.

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

Это правильный курс действий?

V C

 func createUsageHistoryTabs() -> [Consumption] {
    var tabs = [Consumption]()

    let v1 = Consumption(pageIndex: 0, viewModel: viewModel)
    let v2 = Consumption(pageIndex: 1, viewModel: viewModel)

    tabs.append(v1)
    tabs.append(v2)
    return tabs
}

func setupScrollView() {

    if(!hasBeenCreated) {
        let tabs = createUsageHistoryTabs()
        scrollview.frame = CGRect(x: 0, y: 0, width: container.frame.width, height: container.frame.height)
        scrollview.contentSize = CGSize(width: view.frame.width * CGFloat(tabs.count), height: 1.0)
        scrollview.isPagingEnabled = true

        for i in 0 ..< tabs.count {
            let slideView = tabs[i]
            slideView.frame = CGRect(x: view.frame.width * CGFloat(i), y: scrollview.frame.origin.y, width: scrollview.frame.width, height: scrollview.frame.height)
            scrollview.addSubview(slideView)
        }

        hasBeenCreated.toggle()
    }


}

UIView:

override init(frame: CGRect) {
    super.init(frame: frame)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

convenience init(pageIndex: Int, viewModel: UsageHistoryViewModel) {
    self.init(frame: CGRect.zero)
    self.pageIndex = pageIndex
    self.viewModel = viewModel

    commonInit()
}

func commonInit() {
    Bundle.main.loadNibNamed(kCONTENT_XIB_NAME, owner: self, options: nil)
    contentView.fixInView(self)
    setupView()

    footer.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleFooterTap)))

    viewModel?.cdrDelegate = self

    tableView.register(EmptyCell.self, forCellReuseIdentifier: "EmptyCell")
    tableView.register(UINib(nibName: "TVCell", bundle: nil), forCellReuseIdentifier: "TVCell")

    tableView.allowsSelection = false
    tableView.delegate = self
    tableView.dataSource = self


}

1 Ответ

0 голосов
/ 23 марта 2020

В этой забаве c:

func setupScrollView() {

    if(!hasBeenCreated) {

        // this line creates a LOCAL array
        let tabs = createUsageHistoryTabs()

        scrollview.frame = CGRect(x: 0, y: 0, width: container.frame.width, height: container.frame.height)
        scrollview.contentSize = CGSize(width: view.frame.width * CGFloat(tabs.count), height: 1.0)
        scrollview.isPagingEnabled = true

        for i in 0 ..< tabs.count {
            let slideView = tabs[i]
            slideView.frame = CGRect(x: view.frame.width * CGFloat(i), y: scrollview.frame.origin.y, width: scrollview.frame.width, height: scrollview.frame.height)
            scrollview.addSubview(slideView)
        }

        hasBeenCreated.toggle()
    }


}

Вы создаете локальный массив Consumption объектов. Из каждого объекта вы добавляете его view в scrollView. Как только этот забавный c завершается, tabs больше не существует ... он выходит из области видимости.

Вы хотите создать переменную уровня класса:

var tabsArray: [Consumption]?

и затем измените эту переменную вместо создания локального экземпляра:

func setupScrollView() {

    if(!hasBeenCreated) {

        // this line creates a LOCAL array
        tabsArray = createUsageHistoryTabs()

        ...

Ваши пользовательские классы должны быть доступны до тех пор, пока вы не удалите их (или tabsArray не выйдет за рамки).

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


РЕДАКТИРОВАТЬ после обсуждения комментариев ...

Если представления таблиц работают, но не "обновляются" до тех пор, пока они не прокручиваются - вы сказали, что в главном потоке вызывается reload - вы можете попробовать любой из этих вариантов (или оба ... эксперимент):

    tableView.reloadData()
    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()

    tableView.reloadData()
    tableView.beginUpdates()
    tableView.endUpdates()
...