self.tabBarController.selectedIndex не вызывает viewDidAppear - PullRequest
0 голосов
/ 25 января 2019

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

Мой вариант использования очень прост. У меня есть viewController с кнопкой, когда эта кнопка нажата, я хочу перейти на другую вкладку и перезагрузить данные, включая вызов API.

При использовании кнопки я хорошо перехожу на вкладку, но viewDidAppear не вызывается.

Если на другой вкладке и перемещаться с помощью панели вкладок, viewDidAppear работает нормально. Также viewWillAppear работает, но я должен добавить ручную задержку к функциям, которые я хочу вызвать, так что это не идеально.

Так что же мне нужно сделать, чтобы перемещаться с помощью self.tabBarController.selectedIndex = 0 и получать функциональность viewDidAppear?

Обновление: Вызванный мною метод viewWillAppear вызывается, но я вынужден добавить задержку для своих функций, чтобы они работали, и это немного неуклюже, не идеально. Не уверен, почему viewDidAppear не будет работать: (

Вот скриншот структуры: enter image description here

Я ценю любую помощь в этом!

«Текущий» ViewController - это индекс моей вкладки 2:

import UIKit

class PostPreviewVC: UIViewController {

//Here I create a post object and post it to the timeline with the below button

    @IBAction func postButtonPressed(_ sender: Any) {

    //create the post via Firebase api

    self.tabBarController?.selectedIndex = 0

    }
}

В моем пункте назначения viewController:

import UIKit
import Firebase
import SDWebImage
import AVFoundation

class HomeVC: UIViewController {

// MARK: - PROPERTIES

var posts = [Post]()
let refreshControl = UIRefreshControl()
//more properties...


@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    setupUI()
    configureTableView()
    reloadTimeline()

    UserFirebase.timeline { (posts) in
        self.posts = posts
        self.tableView.reloadData()
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    print("viewDidAppear")

    _ = self.view
    setupUI()
    configureTableView()
    reloadTimeline()

    UserFirebase.timeline { (posts) in
        self.posts = posts
        self.tableView.reloadData()
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    print("viewWillAppear")

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        self.reloadTimeline()
        self.configureTableView()
    }
}

//All the tableview code below here...
}

Добавлен пользовательский класс для контроллера панели вкладок:

import UIKit

class TabBarController: UITabBarController, UITabBarControllerDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    print("viewDidAppear in tabBar custom Class called")
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    print("viewWillAppear in tabBar custom Class called")
}
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Для UITabBarController viewDidLoad вызывается только один раз. и ваши viewWillAppear и viewDidAppear будут вызываться несколько раз. Вы можете проверить, звонят ли вам viewWillAppear или нет. потому что ваше представление будет вызвано до того, как ваше viewDidAppear будет похоже на процесс обратного инжиниринга.

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

Примечание. В случае UITabbarController всегда выполняйте задачу обновления пользовательского интерфейса и API, вызывая задачу либо в viewWillAppear или viewDidAppear

0 голосов
/ 25 января 2019

Когда вы используете UITabBarController, метод viewDidLoad будет вызываться только один раз, когда в память загружается любой UIViewController.После этого, когда вы перемещаетесь по тому же UIViewController, он загружается из памяти.

Чтобы преодолеть эту проблему, вы должны разделить код на viewDidLoad & viewDidAppear.Таким образом, в viewDidLoad вы помещаете только тот код, который хотите инициализировать, один раз в приложение, например, добавляя UIView или другие вещи, в то время как в viewDidAppear / viewWillAppear вы можете делать вызовы API или некоторые другие.функции, которые извлекают динамические данные.

Наконец, когда вы вызываете self.tabBarController.selectedIndex = 0, он будет вызывать viewDidLoad только один раз и viewDidAppear / viewWillAppear каждый раз, когда вы перемещаетесь по этому UIViewController.

Надеюсь, это поможет понять, например, как работает UITabBarController.

...