Динамический UILabel на основе строки - PullRequest
0 голосов
/ 01 июля 2018

У меня есть UILabel. Текст в UILabel выглядит примерно так:

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

а затем, когда нажата кнопка, показывать всю строку?

Надеюсь, это не слишком запутало. Спасибо вам за помощь! Я использую Swift 4.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вы можете разделить текст метки на 2 части: labelContent, который вы получаете от API, и 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
    }
}
0 голосов
/ 01 июля 2018

Если он отформатирован таким же образом, и вы знаете элемент, который отделяет первую строку от остальных, вы можете использовать функцию разделения на строку, чтобы разбить исходную строку на подстроку.

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
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...