2017-05-09 2 views
0

몇 가지 탭이있는 탐색 탭 막대가 있습니다. 나는 내가 탭에있을 때 항상 내가 어디에 있든 상관없이 나를보기에 가져다 줄 수있는 기능을 원합니다.탭 탐색 모음 일관성

예를 들어

:

"설명서"탭 표시 줄이 "문서 열기"

설명서로 이동 열려있는 문서를 타격 한 후 "설명서"를 타격에 의해 볼 다른 탭 표시 줄; 오픈 데이터 모듈리스트를 보길 기대하고 싶습니다. 대신에 "마지막 오픈 데이터 모듈"로 이동합니다.

어떻게하면됩니까?

"문서 열기"에 대한 코드는 다음과 같습니다 : 그것은 당신의 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) 
} 

} 
+0

당신이 뭘 하려는지 나타내는 스크린 샷 또는 코드를 제공 할 수있다 : 내 RootTabBarViewController에서 UITabBarController가 설정하고있는 viewDidLoad (에서 "위임 = 자기")를 설정하고 아래의 기능을 구현하기위한 것이었다해야 할 일을했을 모든? 문제를 이해하는 데 어려움을 겪고 있습니다. – toddg

+0

코드로 질문을 업데이트했습니다. 이 코드는 기본적으로 테이블보기에서 매뉴얼을 보여 주며 셀을 클릭하면 해당 셀의 상세 페이지가 표시됩니다. 이제 탭 표시 줄을 전환 한 다음이 탭 (열린 문서)으로 돌아 가면 자세한보기가 표시되지만 테이블보기를 표시하겠습니다. 희망은 지금 더 의미가 있고 당신은 나를 도울 수 있습니다. 무엇이든 묻고 답할 것입니다. – habed

답변

1

당신은 설정할 수 있습니다 당신의 UITabBarControllerDelegate 다음 shouldSelectViewController 구현 아직까지는 볼 수 있습니다. 또 다른 옵션은 전환이 완료 될 때까지 기다린 다음 viewController를 보이지 않게 한 다음 pop으로 이동하는 것입니다.

+0

전환이 완료 될 때까지 기다렸다가 뷰 밖에서 viewController를 팝업하려면 어떻게해야합니까? – habed

+0

UITabBarControllerDelegate를 어떻게 설정합니까? 도와주세요. 감사합니다. BOOL { 경우 (tabBarController> - 클래스 DocumentListViewController : 개인 FUNC의 tabBarController (DocumentListViewController _ tabBarController : : : UITabBarController가, shouldSelect의 ViewController) BaseViewController, UITabBarControllerDelegate { – habed

+0

나는이 방법을 UITabBarControllerDelegate 설정 .selectedViewController? .navigationController? .shouldPerformSegue (withIdentifier : "DocumentViewController", 보낸 사람 : 자기))! 반환 사실 } 컴파일하지만 기능을하지 않습니다 : {? 있는 navigationController .popViewController은 (거짓 애니메이션)}. 도와 주실 수 있겠습니까? 미리 감사드립니다. – habed

1

수정 됨.

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 
if tabBarController.selectedIndex == 1 { 

    if let vc = viewController as? UINavigationController {   
    vc.popViewController(animated: false) 
    } 
} 
관련 문제