Swift - невозможно переименовать кнопку, пока она не нажата - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблема с переименованием кнопки.У меня есть экран с некоторым табличным представлением, где у меня есть элементы, например - «первый», «второй», «третий», ... Я хочу, чтобы когда я нажимал на какой-то элемент, чтобы перейти на другой экран, где будет кнопка, котораяизменит текст в зависимости от того, какой элемент я выберу.Моя проблема в том, что когда я нажимаю на первый элемент, например «первый», кнопка имеет имя «кнопка», а не «first_detail», как в коде ниже.Я добавил кнопку, как это:

@IBAction func testBtn(_ sender: AnyObject) {
    if names[myIndex] == "first" {
        sender.setTitle("first_detail", for: UIControlState.normal)
        self.performSegue(withIdentifier: "testSegue", sender: self)
}
    if names[myIndex] == "second" {
        sender.setTitle("second_detail", for: UIControlState.normal)
        self.performSegue(withIdentifier: "secondSegue", sender: self)
}
}

Спасибо за советы.

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

У меня это так:

  1. Я определяю @IBOutlet weak var itemButton: UIButton!
  2. В кнопку действия я помещаю только

    @ IBAction func testBtn (_отправитель: AnyObject) {if names [myIndex] == "first" {self.performSegue (withIdentifier: "testSegue", sender: self)} if names [myIndex] == "second" {self.performSegue (withIdentifier: "secondSegue", sender: self)}}

  3. Для второго (целевого) VC я поставил эти условия

    if names [myIndex] ==" first "{itemButton.setTitle ("first_detail", для: UIControlState.normal)} if names [myIndex] == "second" {itemButton.setTitle ("second_detail", для: UIControlState.normal)}

  4. работает как мне нужно

0 голосов
/ 25 апреля 2018

Создайте выход для кнопки в VC и установите заголовок для кнопки вместо отправителя

@IBOutlet weak var itemButton: UIButton!

и проверьте, входит ли оно в любое из условий if

@IBAction func testBtn(_ sender: AnyObject) {
    if names[myIndex] == "first" {
        itemButton.setTitle("first_detail", for: UIControlState.normal)
        self.performSegue(withIdentifier: "testSegue", sender: self)
    }
    if names[myIndex] == "second" {
        itemButton.setTitle("second_detail", for: UIControlState.normal)
        self.performSegue(withIdentifier: "secondSegue", sender: self)
    }
}
0 голосов
/ 25 апреля 2018

Причина, по которой ваш код не работает, заключается в том, что IBAction запускается после нажатия кнопки.Код не может магическим образом читать мысли вашего пользователя и изменять текст непосредственно перед нажатием кнопки.

Создайте свойство с именем 'buttonTitle' или что-то подобное на вашем целевом контроллере представления.Я предпочитаю избегать опций, если я могу, поэтому что-то вроде этого будет то, что вы хотите на VC назначения:

var buttonTitle = ""

Если вы используете переход, то вам нужнопереопределите prepare(for:sender:) и установите свойство buttonTitle на контроллере представления destination в segue (для этого вам потребуется привести destination в качестве подкласса контроллера представления назначения).Примерно как в этом примере (я просто называю класс MyDestinationVC вашего целевого VC. Замените его на правильное имя):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationVC = segue.destination as? MyDestinationVC {
        destinationVC.buttonTitle = names[myIndex]
    }
}

Или, если вы нажимаете / представляете вручную из кода, то перед тем, как поставитьна экране установите то же свойство buttonTitle.

Затем в методе viewDidLoad() контроллера целевого представления установите заголовок кнопки на основе свойства buttonTitle.

override func viewDidLoad() {
    super.viewDidLoad()
    myButton.setTitle(buttonTitle, for: .normal)
}

Примечание: Другие решения, которые автоматически обновляют для вас кнопку, будут вызывать сбои при вызове до viewDidLoad(), потому что просмотренные ими представления еще не были инициализированы.

0 голосов
/ 25 апреля 2018

Вы можете установить название кнопки следующим образом

var buttonTitle: String {
        didSet {
            self.yourbutton.setTitle(buttonTitle, for: .normal)
        }
    }

Вы можете использовать

self.buttonTitle = "First"
...