2017-01-17 4 views
0

Я хочу изменить текст метки, чтобы узнать статус прогресса, пока Touch Up action cals. Вот пример:Как изменить текст UILabel при нажатии кнопки

@IBOutlet weak var stsLabel: UILabel! // label to show to user, the progress position 

@IBAction func updateDB(_ sender: Any) { 

    stsLabel.text = "creating table" 
    // do some stuf 

    stsLabel.text = "inserting table A" 
    // some code 
    // and i have some cases again 

    stsLabel.text = "Complete" 
} 

func setTitle(label:UILabel, title:String){ 
    DispatchQueue.main.async(execute: {() -> Void in 
     label.text = title 
    })  
} 

Этот код изменит текст на ярлыке, только когда действие будет завершено. Я пробовал с setTitle(stsLabel,"any text"), это тоже не помогает. Пожалуйста, помогите мне решить эту проблему. Информация: Я использую 3 версии быстро.

+0

использование TouchDown для состояния –

+0

управления UIButton Что действие, которое будет завершено? Потому что, если у этого есть окно завершения, вы можете обновить ярлык. –

+0

действие кнопка касание вверх –

ответ

1

Поскольку вы не предоставили достаточную информацию для полного ответа, этот ответ основан на «наилучшей догадке», и поэтому он может быть неточным.

ЕСЛИ ваш «делать какой-либо код» выполняется в основном потоке, тогда вы увидите обновления пользовательского интерфейса, когда все будет сделано, поскольку вы блокируете основной поток.

Если ваш код выглядит следующим образом:

@IBAction func updateDB(_ sender: Any) { 

    stsLabel.text = "creating table" 
    DispatchQueue.global().async { 
     // do some stuf 
    } 

    stsLabel.text = "inserting table A" 
    DispatchQueue.global().async { 
     // some code 
     // and i have some cases again 
    } 

    stsLabel.text = "Complete" 
} 

Тогда проблема заключается в том, что «делать некоторые вещи» код выполняется асинхронно, так что все текстовые задания выполняются один за другим на главном потоке, так вы увидите только последний, потому что другие два слишком быстры, чтобы их можно было увидеть.

Если ваш код выглядит следующим образом:

@IBAction func updateDB(_ sender: Any) { 

    stsLabel.text = "creating table" 
    DispatchQueue.global().async { 
     // do some stuf 

     stsLabel.text = "inserting table A" 
     // some code 
     // and i have some cases again 

     stsLabel.text = "Complete" 
    } 
} 

Тогда проблема заключается в том, что все связанные с UI вещи должны идти в основном потоке. Результат выполнения этого основного потока приведет к тому, что обновление произойдет с огромной задержкой, а в некоторых случаях это может привести к сбою.

Здоровый способ сделать это, отправив на основной поток UI ops. Код должен выглядеть следующим образом:

@IBAction func updateDB(_ sender: Any) { 

    stsLabel.text = "creating table" 
    DispatchQueue.global().async { 
     // do some stuf 

     DispatchQueue.main.async(execute: {() -> Void in 
      stsLabel.text = "inserting table A" 
     }) 
     // some code 
     // and i have some cases again 

     DispatchQueue.main.async(execute: {() -> Void in 
      stsLabel.text = "Complete" 
     }) 
    } 
} 
+0

'DispatchQueue.global (атрибуты: .qosUserInitiated)' получает ошибку «Ярлыки аргументов» (attributes :) »не соответствуют никаким доступные перегрузки' –

+0

Я использую 'DispatchQueue.global(). async', и он работает, большое спасибо –

Смежные вопросы