Использование кнопки в другом контроллере представления - PullRequest
0 голосов
/ 21 июня 2020

Этот вопрос уже может быть задан о скрытии кнопок, но мне было интересно, могу ли я просто нажать кнопку, которая повлияет на переменные в другом контроллере представления. Например, у меня есть firstViewController и endViewController. В endViewController есть кнопка, которую нажимает пользователь, которая должна изменить переменную в firstViewController. Есть ли способ получить доступ к кнопке endViewController из firstViewController?

Edit

Я еще не пробовал много, кроме управления, нажав кнопку endViewController в firstViewController ( что не сработало).

class firstViewController: UIViewController {
    @IBAction func nextButton(_ sender: Any) { //button that sits in endViewController
    
    }
}

Ответы [ 3 ]

1 голос
/ 21 июня 2020

Контроллер первого представления

Код для контроллера первого представления:

import UIKit

class FirstViewController: UIViewController, DataEnteredDelegate {

@IBOutlet weak var label: UILabel!

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showSecondViewController" {
        let secondViewController = segue.destinationViewController as! SecondViewController
        secondViewController.delegate = self
    }
}

func userDidEnterInformation(info: String) {
    label.text = info
}
}

Обратите внимание на использование нашего настраиваемого протокола DataEnteredDelegate.

Второй контроллер представления и протокол

Код для второго контроллера представления:

import UIKit

// protocol used for sending data back
protocol DataEnteredDelegate: class {
func userDidEnterInformation(info: String)
}

class SecondViewController: UIViewController {

// making this a weak variable so that it won't create a strong reference cycle
weak var delegate: DataEnteredDelegate? = nil

@IBOutlet weak var textField: UITextField!

@IBAction func sendTextBackButton(sender: UIButton) {
    
    // call this method on whichever class implements our delegate protocol
    delegate?.userDidEnterInformation(textField.text!)
    
    // go back to the previous view controller
    self.navigationController?.popViewControllerAnimated(true)
}
}

Обратите внимание, что протокол находится за пределами класса контроллера представления.

Вот и все. Запустив приложение сейчас, вы сможете отправлять данные обратно из второго контроллера представления в первый.

Исходное сообщение: { ссылка }

0 голосов
/ 21 июня 2020

Существует 2 метода:

  1. Вы можете создать переход от кнопки в endviewcontroller к firstviewcontroller в раскадровке. Вы можете настроить забаву c prepare (для перехода: UIStoryboardSegue, отправитель: Any?) Для этого. let endV C = endViewcontroller () endV C .color = "blue"

  2. Вы можете оставить переменную, значение которой нужно изменить, как stati c datatype. При нажатии кнопки вы можете получить доступ к переменной как EndViewController.color = "Red". Пожалуйста, используйте переменные stati c только в том случае, если вы хотите, чтобы другие контроллеры View имели к ним прямой доступ.

0 голосов
/ 21 июня 2020

Вы можете использовать ШАБЛОН ДЕЛЕГАТА для передачи данных обратно:

Вот небольшая справка по делегатам между двумя контроллерами представления:

Шаг 1: Создайте протокол в UIViewController, который вы будете удалять / будет отправлять данные.

protocol FooTwoViewControllerDelegate:class {
    func myVCDidFinish(_ controller: FooTwoViewController, text: String)
}

Step2: Объявите делегата в классе отправки (например, UIViewcontroller)

class FooTwoViewController: UIViewController {
    weak var delegate: FooTwoViewControllerDelegate?
    [snip...]
}

Step3: Используйте делегат в методе класса для отправки данных в метод получения, который является любым методом, который принимает протокол.

@IBAction func saveColor(_ sender: UIBarButtonItem) {
        delegate?.myVCDidFinish(self, text: colorLabel.text) //assuming the delegate is assigned otherwise error
}

Шаг 4: Принять протокол в классе приема

class ViewController: UIViewController, FooTwoViewControllerDelegate {

Шаг 5: Реализовать метод делегата

func myVCDidFinish(_ controller: FooTwoViewController, text: String) {
    colorLabel.text = "The Color is " +  text
    controller.navigationController.popViewController(animated: true)
}

Шаг 6: Установите делегата в prepareForSegue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" {
        let vc = segue.destination as! FooTwoViewController
        vc.colorString = colorLabel.text
        vc.delegate = self
    }
}
    

И это должно сработать. Это, конечно, всего лишь фрагменты кода, но они должны дать вам представление. Для подробного объяснения этого кода вы можете go перейти к моей записи в блоге здесь:

сегменты и делегаты

Если вам интересно, что происходит под капот с делегатом Я написал об этом здесь:

под капотом с делегатами

исходный ответ

...