【问题标题】:Trigger an event (tableview reload) whenever a text is in a certain position of a textView in iOS每当文本位于 iOS 中 textView 的某个位置时触发事件(tableview 重新加载)
【发布时间】:2015-08-10 10:52:22
【问题描述】:

我刚开始使用 iOS 编程,但在任何地方都找不到有关此问题的答案。

我有一个 Textview,其中包含分段的大文本。 每当每个段落到达 TextView 的中间时,我想触发 Tableview 的重新加载。

我该怎么做?

这是我目前写的代码:

@IBOutlet weak var testo: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()

    if databaseDB.open() {

        // Here I definethe string attributes
        var style = NSMutableParagraphStyle()
        style.lineSpacing = 15
        let font = UIFont(name: "Georgia", size: 18.0) ?? UIFont.systemFontOfSize(18.0)
        let textFont = [NSFontAttributeName:font, NSParagraphStyleAttributeName : style]
        let fontSuper = UIFont(name: "Georgia-Italic", size: 13.0) ?? UIFont.systemFontOfSize(13.0)
        let superFont = [NSFontAttributeName:fontSuper, NSBaselineOffsetAttributeName:6]

        // and here the variables
        let mainText = NSMutableAttributedString()
        var paragraphId : String = ""

        // I load the text from a table in the database
        let querySQL = "SELECT id, versetext FROM table1"
        let results:FMResultSet? = databaseDB.executeQuery(querySQL, withArgumentsInArray: nil)

        while results!.next(){

            paragraphId = results!.stringForColumn("id")

            // I add some other information from another table (here goes also other code, but I have skipped it for simplicity)
            let queryDescrSQL = "SELECT paragraph FROM table2 WHERE id = \(paragraphId)"
             let paragraphResults:FMResultSet? = databaseDB.executeQuery(queryDescrSQL, withArgumentsInArray: nil)

            if paragraphResults?.next() == true {
            // here I add the attributes to the text to be shown
                let numberParagraph = paragraphResults!.stringForColumn("paragraph")

                let paragraphNumber = NSAttributedString(string: numberParagraph, attributes:superFont)
                mainText.appendAttributedString(paragraphNumber)

                let textParagraph = results!.stringForColumn("versetext")+" "
                let paragraphText = NSAttributedString(string: textParagraph, attributes:textFont)
                mainText.appendAttributedString(paragraphText)
            }
        }
        databaseDB.close()
        // and finally everything is loaded on the TextView
        testo.attributedText = mainText
    }

}
// I'm letting out the code for the TableView, as it is probably not relevant for the matter

我正在考虑向paragraphNumber 添加一些其他属性,例如here,但我找不到如何做到这一点。

提前致谢,

席尔沃

【问题讨论】:

  • 请附上您当前的代码以及到目前为止您尝试过的代码。

标签: ios swift scrollview


【解决方案1】:

不清楚你的段落是如何划分的(每个段落都有自己的UITextView,或者它们都形成一个大的文本视图),但基本情况是你需要在滚动时重新加载表格视图视图到达某个滚动位置。

UITableView 有一个方法reloadData,所以当你的滚动视图位于该位置时调用它。

滚动一个滚动视图仅仅意味着你正在修改它的contentOffset,并且滚动视图在每次内容偏移改变时发送它的delegate一条消息。使您的控制器成为滚动视图的委托,并实现scrollViewDidScroll(_:) 委托方法。在这里,检查当前的内容偏移量,如果它是您要查找的值,则重新加载表格视图:

class MyViewController: UIViewController, UIScrollViewDelegate {

    // var scrollView = ...
    // var tableView = ...

    override viewDidLoad() {
        super.viewDidLoad()
        scrollView.delegate = self
    }

    func scrollViewDidScroll(scrollView: UIScrollView) {
        // var scrollThreshold = (calculate some scroll threshold based on your paragraph text)
        if scrollView.contentOffset.y > scrollThreshold {
            tableView.reloadData()
        }
    }
}

【讨论】:

  • 为了做到这一点,我不应该提前知道每个段落的大小(这对于大文本可能会很困难)?如果我想在每次新段落移动到某个位置时重新加载 tableview 怎么办?我没有考虑将每个段落加载到自己的 UITextView 中,我应该提前计算每个段落的大小/位置吗?
  • 你试过什么?您决定计算段落大小的方式取决于您,并且取决于您的应用程序/视图的结构以及您想要实现的目标。字符串绘制(以及边界检查)可能会很昂贵,具体取决于您更改它们的程度/频率,但不要过早优化。
  • 我将从头开始(作为初学者......)。我从一个 SQLite 数据库开始,我想要一个包含上下文的窗格实际上,我首先将我的文本加载到 Tableview 上(来自 SQLite 数据库),每个单元格都链接到
  • 对不起,我一直按回车键移动到新行,并插入了评论....
  • 我能否建议您将此类详细信息附加到您的问题中 - 不鼓励在 cmets 中进行扩展聊天,因为它们难以理解并且对未来的读者没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2020-12-07
  • 2019-06-08
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多