#swift #xcode #uiviewcontroller #uitabbarcontroller #wkwebview
#swift #xcode #uiviewcontroller #uitabbarcontroller #wkwebview
Вопрос:
Я новичок в разработке iOS, используя Xcode 10.2 и Swift 5 (последнее обновление). Я разрабатываю приложение для iOS, используя панель вкладок и WKWebView. Приложение имеет 5 вкладок, каждая из которых отображает отдельную веб-страницу.
Я хочу, чтобы пользователь чувствовал, что когда пользователь переходит на первую вкладку и просматривает там, затем пользователь нажимает другую панель вкладок, после этого пользователь возвращается на первую вкладку и все еще отображает ту же страницу, прежде чем перейти на другую вкладку. Если пользователь хочет вернуться на корневую страницу вкладки, просто снова нажмите активную панель вкладок.
Как я могу это сделать?
Я использую RootViewController, затем расширяю до 5 других ViewController:
— HomeViewController
— SignalViewController
— ContactViewController
— NewsViewController
— ProfileViewController
Я пробовал некоторые предложения со многих сайтов, но не удалось, например, использовать:
— UITabBarControllerDelegate TabBarController (: didSelect:)
— UIViewController viewDidAppear(🙂
— UIViewController viewWillAppear(🙂
— super.viewDidLoad () или self.viewDidLoad()
— UIView setNeedsDisplay(🙂
— веб-просмотр.load()
// set global variable for checking selected index tab
var prevTab: Int = 0
var currentTab: Int = 0;
class RootViewController: UIViewController, WKUIDelegate, UITabBarControllerDelegate {
// declare var for WebKit
var webView: WKWebView!
// load view of WebKit
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
// for display URL in WebKit
func goToUrl(url: String){
let myURL = URL(string:url)
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
}
class HomeViewController: RootViewController {
let defaultUrl : String = "https://yourdomain.com/"
override func viewDidLoad() {
super.viewDidLoad()
// for checking click on active tab to root page of tab
self.tabBarController?.delegate = self
// call URL to dipslayed on WebKit View
self.goToUrl(url: defaultUrl)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Tells the delegate that the user selected an item in the tab bar
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController){
// get selected index tab
currentTab = self.tabBarController?.selectedIndex ?? 0
if(prevTab == currentTab){
// MUST GO TO DEFAULT URL
}
// save selected index tab for next checking
prevTab = currentTab
}
}
Я ожидаю, что когда пользователь снова нажмет АКТИВНУЮ панель вкладок (prevTab равен currentTab), WKWebView перейдет к URL по умолчанию, но это не удается (ничего не произошло).
Комментарии:
1. Можете ли вы объяснить
but it fails
средства? Где происходит сбой или каково ваше ожидаемое поведение? Или, точнее, вы можете добавить свои другие скриншоты?2. «но это не удается» означает, что приложению не удалось перейти на URL по умолчанию. Я ожидаю, что когда пользователь снова нажмет АКТИВНУЮ панель вкладок, wkwebview перейдет на URL по умолчанию.
3. Удалить
self.goToUrl(url: defaultUrl)
изviewDidLoad()
и добавить внутриviewWillAppear(_ animated: Bool)
. Он будет обновляться при каждом переключенииTabs
4. Нет, я не хочу обновлять вкладку всякий раз, когда пользователь переключает вкладки. Вкладка обновляется только тогда, когда пользователь снова нажимает АКТИВНУЮ вкладку. Пример: пользователь получает доступ к первой вкладке и переходит с нее на другую веб-страницу «Наши услуги» с веб-страницы «Главная». Затем пользователь хочет вернуться в «Home», поэтому пользователь просто нажимает первую вкладку (АКТИВНАЯ вкладка), затем WKWebView снова переходит к URL по умолчанию.
5.Вам нужно
different
Tabs
снова загрузить URL по умолчанию, потому что вTabViewController
он не будет повторно создавать ViewController, если он уже загружен.
Ответ №1:
Согласно опубликованному вопросу, пока я понимаю, что вам нужно правильно реализовать приведенные ниже функции с помощью . UITabBarController, UITabBarControllerDelegate
.
1) ```override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
self.tabBarController?.delegate = self
} ```
2) ```override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
} ```
3) ``` override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { switch item.title! {
case "First":
print("First")
case "Second":
print("Second")
default:
print("Home")
self.selectedIndex = 2 . /// selection of Tabbar item
}
} ```