基于字符串的动态UILabel

时间:2018-06-30 22:29:59

标签: ios swift string uilabel

我有一个UILabelUILabel中的文本看起来像这样:

Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Website - example.com
YouTube - youtube.com/example
Twitter - twitter.com/example
Instagram - twitter.com/example

因此,此文本是动态的。我从API获得字符串,并且该API包含一个类似于上面的字符串。第一段更改。它可以是多个段落或任何内容。但是带有网站链接的文本保持不变。

好吧,基本上,我希望标签仅显示字符串的第一部分。然后,每当用户按下按钮时,它就会显示整个字符串。由于字符串的第一部分发生更改,因此无法设置numberOfLines。有什么办法告诉标签只显示

Website - example.com
YouTube - youtube.com/example
Twitter - twitter.com/example
Instagram - twitter.com/example

,然后每当按下按钮时,显示整个字符串?

希望这并不太令人困惑。感谢您的帮助!我正在使用Swift4。

2 个答案:

答案 0 :(得分:0)

如果采用相同的格式,并且您知道将第一个字符串与其余字符串分开的元素,则可以对字符串使用split函数将原始str拆分为子字符串。

class ViewController: UIViewController 
{
   @IBOutlet weak var myLabel: UILabel!
   let strFromApi = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \nWebsite - example.com \nYouTube - youtube.com/example \nTwitter - twitter.com/example \nInstagram - twitter.com/example"

   override func viewDidLoad()
   {
       super.viewDidLoad()
       self.myLabel.text = getFirstSection(of: strFromApi)
   }

   func getFirstSection(of str: String) -> String
   {
       if let newStr = str.split(separator: "\n").first
       {
           return String(newStr)
       }
       return str
   }

   @IBAction func seeMoreAction(_ sender: UIButton)
   {
       self.myLabel.text = strFromApi
   }
}

答案 1 :(得分:0)

您可以将标签的文本分为两部分:从API获得的labelContent和要添加到标签的固定字符串labelFooter。然后,将属性观察器放在它们上以更新UILabel

class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!

    /// The actual text that you get from the API
    var labelContent = "" {
        didSet {
            label.text = labelContent + (isExpanded ? labelFooter : "")
        }
    }

    /// The fixed footer string
    let labelFooter = """


    Website - example.com
    YouTube - youtube.com/example
    Twitter - twitter.com/example
    Instagram - twitter.com/example
    """

    /// Whether or not the label shows the footer
    var isExpanded = false {
        didSet {
            // A trick to trigger `didSet` on `labelContent`
            labelContent = { labelContent }()
        }
    }

    override func viewDidLoad() {
        // Get this from the API
        labelContent = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."

        // This is a trick to trigger to `didSet` observer on `isExpanded`
        isExpanded = { isExpanded }()
    }

    /// The action to show/hide the footer
    @IBAction func toggleExpand(_ sender: Any) {
        isExpanded = !isExpanded
    }
}