iOS开发:webview动态添加配置返回、关闭按钮(简单又完美)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发:webview动态添加配置返回、关闭按钮(简单又完美)相关的知识,希望对你有一定的参考价值。

参考技术A 之前的想法是通过webview的navigationDelegate的各个生命周期中,判断webview的canGoBack属性,但是有不少缺陷:
比如单页应用的跳转不会触发生命周期,如果在didFinishNavigation中判断canGoBack,这要等页面加载完成才会执行,有很大的延迟.

下面是解决方案,其实很简单,就是通过kvo来监听canGoBack的变化:

根据微信的体验,微信的底部前进后退的状态判断也是根据监听canGoBack canGoForward来动态配置的

如何使用swift在ios中动态/编程添加多个UITableView? [关闭]

【中文标题】如何使用swift在ios中动态/编程添加多个UITableView? [关闭]【英文标题】:How to add multiple UITableView dynamically/programatically in ios using swift? [closed] 【发布时间】:2016-05-31 08:07:13 【问题描述】:

我需要设计一个屏幕截图中提到的屏幕:

在这里,我被要求根据数据库中可用的记录数动态添加 'N'UITableView

我在谷歌上搜索了很多,但没有可用的教程/指导。所以我认为这个问题会帮助很多和我一样面临同样问题的人。

【问题讨论】:

你确定是“n tableviews”而不是“n tableviewrows”吗? 是 N 个表视图,而不是 N 个表视图行。请看我附上的截图。 这么简单,添加一个uiscrollview,然后根据每个tableview的标签添加uitableviews。 @Saranya 最好在这里添加你的图片,以后链接将不可用,所以你的问题将变得难以理解 但 UITableView 的数量只能在运行时确定,而不能在设计时确定。这才是真正的 chellange。 【参考方案1】:

如果你的项目必须处理几个 tableViews,你可以像这个项目 https://github.com/gabrieltheodoropoulos/iOS-Swift-PageControl 一样实现它,但是,而不是通过使用 UITableView 来使用 UIView,你可以做你想做的事..

您可以通过更正情节提要中的 scrollView 框架来自定义主 viewController 以添加名称、年龄和更新按钮,这很简单。

附:关于内存消耗,如果您的项目很重,您可以考虑一种方法来重用 tableView 变量,如stack overflow post

中更好地解释

下面是一个如何修改所有代码来实现它的例子:

class ViewController: UIViewController, UIScrollViewDelegate, UITableViewDelegate,UITableViewDataSource 

    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var pageControl: UIPageControl!

    let totalPages = 8  // here you put your datasource array count

    var currentTableView : UITableView!

    let sampleBGColors: Array<UIColor> = [UIColor.redColor(), UIColor.yellowColor(), UIColor.greenColor(), UIColor.magentaColor(), UIColor.orangeColor()]

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

        configureScrollView()
        configurePageControl()
    

    func configureScrollView() 

        scrollView.pagingEnabled = true
        scrollView.showsHorizontalScrollIndicator = false
        scrollView.showsVerticalScrollIndicator = false
        scrollView.scrollsToTop = false
        scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * CGFloat(totalPages), scrollView.frame.size.height)
        scrollView.delegate = self

        // Load the TestView view from the TestView.xib file and configure it properly.
        for i in 0 ..< totalPages 
            // Load the MyTable : a XIB contain a tableView
            let myTable = NSBundle.mainBundle().loadNibNamed("MyTable", owner: self, options: nil)[0] as! UITableView

            // Set its frame and the background color.
            myTable.frame = CGRectMake(CGFloat(i) * scrollView.frame.size.width, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height)
            myTable.backgroundColor = sampleBGColors[i]

            myTable.delegate = self
            myTable.dataSource = self
            self.currentTableView = myTable

            let label = myTable.viewWithTag(1) as! UILabel
            label.text = "Page #\(i + 1)"

            scrollView.addSubview(myTable)
        
    


    func configurePageControl() 
        pageControl.numberOfPages = totalPages
        pageControl.currentPage = 0
    


    // MARK: UIScrollViewDelegate method implementation

    func scrollViewDidScroll(scrollView: UIScrollView) 
        // Calculate the new page index depending on the content offset.
        let currentPage = floor(scrollView.contentOffset.x / UIScreen.mainScreen().bounds.size.width);

        // Set the new page index to the page control.
        pageControl.currentPage = Int(currentPage)
    


    // MARK: IBAction method implementation

    @IBAction func changePage(sender: AnyObject) 
        // Calculate the frame that should scroll to based on the page control current page.
        var newFrame = scrollView.frame
        newFrame.origin.x = newFrame.size.width * CGFloat(pageControl.currentPage)
        scrollView.scrollRectToVisible(newFrame, animated: true)

    

    // Add here UITableViewDelegate and UITableViewDatasource methods..

【讨论】:

感谢您的出色解决方案。我会尝试这种方法。 我已经尝试过您的方法,非常棒。问题是在 xib 中添加 tableview。因为我需要每个单元格中的复选框和标签。但我这里没有原型单元。还有其他方法可以实现吗? 当然,您必须创建另一个具有 UITableViewCell 类型的 XIB。在这个 *** 帖子中,您可以找到解决方案:***.com/a/25545185/1894067 我为 UITableViewCell 创建了一个带有 M13Checkbox 和标签的 XIB。但是,如果我单击复选框,则不会选择它,而是选择了整行。这里有什么问题吗? 我不知道 M13Checkbox,尝试打开一个新问题,编写库链接并在此处发布问题链接,我会尽力帮助您..【参考方案2】:

正如一些 cmets 所说,您可以将滚动视图与水平滚动一起使用并动态添加表格视图,但如果存在太多表格视图,则会产生大量内存消耗,因为滚动视图会将所有表格保留在内存中。分页也可能发生同样的事情。

如果您需要显示太多表格,则需要使用可重复使用的东西。

所以,我认为UICollectionView 是更好的选择!

用一个单元格获取集合视图,并在集合视图的单元格中显示 tablview。

你可以google一下如何在collectionview中使用tableview,你会得到很多解决方案。

希望这会有所帮助:)

【讨论】:

以上是关于iOS开发:webview动态添加配置返回、关闭按钮(简单又完美)的主要内容,如果未能解决你的问题,请参考以下文章

覆盖ios后退按钮

iOS - 在 WebView 中清除返回缓存

iOS Swift WebView 问题

关闭全屏视图后的Android WebView Video,webview自动滚动

应用关闭时Android WebView保存显示状态

iOS开发-webView添加头部与尾部控件