몇 가지 탭이있는 탐색 탭 막대가 있습니다. 나는 내가 탭에있을 때 항상 내가 어디에 있든 상관없이 나를보기에 가져다 줄 수있는 기능을 원합니다.탭 탐색 모음 일관성
예를 들어:
"설명서"탭 표시 줄이 "문서 열기"
설명서로 이동 열려있는 문서를 타격 한 후 "설명서"를 타격에 의해 볼 다른 탭 표시 줄; 오픈 데이터 모듈리스트를 보길 기대하고 싶습니다. 대신에 "마지막 오픈 데이터 모듈"로 이동합니다.
어떻게하면됩니까?
"문서 열기"에 대한 코드는 다음과 같습니다 : 그것은 당신의 tableview에 다시 나올 경우
func tabBarController(_ tabBarController: UITabBarController,
shouldSelect viewController: UIViewController) -> Bool {
// check if tabBarController.selectedViewController is navController
// containing your detailViewController. If so:
navController.popViewController(animated: false)
return true
}
이 가난 UX 수 있습니다 :
class DocumentListViewController: BaseViewController {
// MARK: - IB Outlets
@IBOutlet weak var tableView: UITableView!
// MARK: - Properties
var webview:WKWebView!
var documentsToDelete:[Node]?
// MARK: - VC Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
title = NSLocalizedString("Open Documents", comment: "")
tableView.delegate = self
tableView.dataSource = self
tableView.register(UINib(nibName: "TablistHeader", bundle: Bundle.main), forHeaderFooterViewReuseIdentifier: "Header")
webview = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
webview.navigationDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//MARK: - Business Logic
func remove(documents nodes:[Node]) {
documentsToDelete = nodes
if let section = nodes.first?.sections.first, let urlString = section["url"], let nodePath = nodes.first?.path {
var readAccessFolder:URL?
let pathComponents = URL(fileURLWithPath: nodePath).pathComponents
if pathComponents.count >= 2 {
let rootFolder = "\(pathComponents[1])"
readAccessFolder = URL(fileURLWithPath: "\(PackageManager.shared.packageFolder)\(rootFolder)")
}
let url = URL(fileURLWithPath: urlString)
_ = webview.loadFileURL(url, allowingReadAccessTo: readAccessFolder!)
}
else {
deleteDocumentsFromList()
}
}
fileprivate func deleteDocumentsFromList() {
if let indexes = self.documentsToDelete?.flatMap({ (node) -> Int? in
return PackageManager.shared.openNodes.index(of: node)
})
{
for i in indexes.reversed() {
PackageManager.shared.openNodes.remove(at: i)
}
self.tableView.reloadData()
webview.load(URLRequest(url: URL(string:"about:blank")!))
}
}
func resetProcedureStepCheckboxes() {
if let dmcs = documentsToDelete?.flatMap({ (node) -> String? in
return node.moduleCode
})
{
webview.evaluateJavaScript("resetProcedureStepCheckboxes(\(dmcs))") { (result, error) in
print(error as Any)
self.deleteDocumentsFromList()
}
}
}
override func showDocumentViewController(for node:Node?, openSegment segment:Int = 0) {
let contentView = self.storyboard?.instantiateViewController(withIdentifier: "DocumentViewController") as! DocumentViewController
contentView.currentNode = node
contentView.initalSegment = segment
contentView.navigationItem.titleView = UILabel.forTitleView(withText: node?.title)
navigationController?.pushViewController(contentView, animated: true)
}
}
// MARK: - UITableViewDataSource
extension DocumentListViewController : UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
if PackageManager.shared.openNodes.count > 0 {
tableView.removeEmptyMessage()
return 1
} else {
tableView.showEmptyMessage(message: NSLocalizedString("No open documents", comment: ""), viewController: self)
return 0
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return PackageManager.shared.openNodes.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let node = PackageManager.shared.openNodes[indexPath.row]
var dText = ""
if let man = node.manual {
dText = "\(man)\n"
}
if let mc = node.moduleCode {
dText = "\(dText)" + "\(mc)"
}
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenDocumentCell", for: indexPath)
cell.imageView?.image = node.image()
cell.imageView?.contentMode = .scaleAspectFill
cell.editingAccessoryType = .none
cell.accessoryType = .disclosureIndicator
cell.textLabel?.text = node.title
cell.detailTextLabel?.numberOfLines = 0
cell.detailTextLabel?.text = dText
return cell
}
}
// MARK: - UITableViewDelegate
extension DocumentListViewController : UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let node = PackageManager.shared.openNodes[indexPath.row]
showDocumentViewController(for: node)
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if PackageManager.shared.openNodes.count == 0 {
return 0
}
return 50
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if PackageManager.shared.openNodes.count == 0 {
return nil
}
let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header") as! TablistHeader
header.titleLabel.text = String.localizedStringWithFormat(NSLocalizedString("%i open documents", comment: ""), PackageManager.shared.openNodes.count)
header.onDelete = { [weak self] in
guard let strongSelf = self else { return }
// show action sheet
let title = NSLocalizedString("Clear list", comment: "")
let msg = NSLocalizedString("Do you really want to clear the list of open documents?", comment: "")
let options = UIAlertController(title:title, message: msg, preferredStyle: .alert)
let deleteAll = UIAlertAction(title: NSLocalizedString("Clear list", comment: ""),
style:.destructive,
handler: { (action) -> Void in
strongSelf.remove(documents: PackageManager.shared.openNodes)
})
options.addAction(deleteAll)
let cancel = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""),
style:.cancel,
handler: nil)
options.addAction(cancel)
strongSelf.present(options, animated: true, completion: nil)
}
return header
}
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let del = UITableViewRowAction(style: .destructive, title: NSLocalizedString("Delete", comment: ""), handler: { [weak self] (action, indexPath) -> Void in
guard let strongSelf = self else { return }
let node = PackageManager.shared.openNodes[indexPath.row]
strongSelf.remove(documents: [node])
})
return [del]
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
}
}
// MARK: - WKNavigationDelegate
extension DocumentListViewController : WKNavigationDelegate {
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
resetProcedureStepCheckboxes()
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
print(error)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let abs = navigationAction.request.url?.absoluteString, abs == "about:blank" {
decisionHandler(.cancel)
}
decisionHandler(.allow)
}
}
당신이 뭘 하려는지 나타내는 스크린 샷 또는 코드를 제공 할 수있다 : 내 RootTabBarViewController에서 UITabBarController가 설정하고있는 viewDidLoad (에서 "위임 = 자기")를 설정하고 아래의 기능을 구현하기위한 것이었다해야 할 일을했을 모든? 문제를 이해하는 데 어려움을 겪고 있습니다. – toddg
코드로 질문을 업데이트했습니다. 이 코드는 기본적으로 테이블보기에서 매뉴얼을 보여 주며 셀을 클릭하면 해당 셀의 상세 페이지가 표시됩니다. 이제 탭 표시 줄을 전환 한 다음이 탭 (열린 문서)으로 돌아 가면 자세한보기가 표시되지만 테이블보기를 표시하겠습니다. 희망은 지금 더 의미가 있고 당신은 나를 도울 수 있습니다. 무엇이든 묻고 답할 것입니다. – habed