Подтвердить что ты не робот

Отправка данных с помощью Segue с помощью Swift

У меня есть два контроллера представления и два представления. В моем первом представлении я установил переменную currentUser в значение false. Мне нужно иметь возможность установить currentUser на true во втором контроллере представления.

При попытке ссылаться на "currentUser" со второго представления, он не выбирает его как "currentUser", определенный в первом контроллере представления.

Как переносить переменные с помощью segue?

4b9b3361

Ответ 1

Устанавливать значения из любого ViewController для второго с помощью segues

Как это:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if(segue.identifier == "yourIdentifierInStoryboard") {

        let yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.value = yourValue

И в вашем классе yourNextViewController.

class yourNextViewControllerClass {

    var value:Int! // or whatever

Вы также можете назвать это программно:

 self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

Задайте значения из вашего целевого объекта управления обращением к главному (первому) ViewController

1. Внедрить протокол, например создать файл с именем protocol.swift.

    protocol changeUserValueDelegate {
       func changeUser(toValue:Bool)
    }

2. установите делегат на второй просмотр

    class yourNextViewControllerClass {

    var delegate:changeUserValueDelegate?

3. установите делегат при загрузке (prepareForSegue)

    if(segue.identifier == "yourIdentifierInStoryboard") {

        var yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.delegate = self

4. добавить функцию в FirstViewController

    func changeUser(toValue:Bool) {
        self.currentUserValue = toValue
    }

5. вызовите эту функцию из вашего второго контрольного монитора

     delegate?.changeUser(true)

6. Установите делегат в свой FirstViewController

    class FirstViewController: UIViewController, ChangeUserValueDelegate {

Ответ 2

Проблема здесь в том, что ваша переменная currentUser имеет тип Bool, который является типом значения. Поэтому передача его с вашего первого контроллера представления на ваш второй контроллер представления фактически создаст новый экземпляр Bool. Вам нужно передать ссылку с вашего первого контроллера представления на ваш второй контроллер представления (см. Сопоставление и типы ссылок для получения более подробной информации о значении и ссылке с помощью Swift).

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


1. Стиль бокса

Здесь мы "вставляем" наш Bool внутри класса и передаем ссылку этого экземпляра класса на второй контроллер представления.

1.1. Создайте класс currentUser:

class CurrentUser {
    var someBooleanValue = true {
        didSet {
            print(someBooleanValue)
        }
    }
}

1.2. Создайте подкласс UIViewController для первого контроллера представления:

import UIKit

class ViewController1: UIViewController {

    let currentUser = CurrentUser()

    override func viewDidLoad() {
        super.viewDidLoad()
        currentUser.someBooleanValue = false
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let viewController2 = segue.destinationViewController as? ViewController2 {
            viewController2.currentUser = currentUser
        }
    }

}

1.3. Создайте подкласс UIViewController для второго контроллера представления:

import UIKit

class ViewController2: UIViewController {

    var currentUser: CurrentUser?

    // Link this IBAction to a UIButton or a UIBarButtonItem in the Storyboard
    @IBAction func toggleBoolean(sender: AnyObject) {
        if let currentUser = currentUser {
          currentUser.someBooleanValue = !currentUser.someBooleanValue
        }
    }

}

2. Стиль закрытия

Здесь мы получаем слабую ссылку на наш первый контроллер представления в закрытии и передаем это закрытие ко второму контроллеру представления.

2.1. Создайте подкласс UIViewController для первого контроллера представления:

import UIKit

class ViewController1: UIViewController {

    var currentUser = true {
        didSet {
            print(currentUser)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        currentUser = false
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let viewController2 = segue.destinationViewController as? ViewController2 {
            let closureToPerform = { [weak self] in
                if let strongSelf = self {
                    strongSelf.currentUser = !strongSelf.currentUser
                }
            }
            viewController2.closureToPerform = closureToPerform
        }
    }

}

2.2. Создайте подкласс UIViewController для второго контроллера представления:

import UIKit

class ViewController2: UIViewController {

    var closureToPerform: (() -> Void)?

    // Link this IBAction to a UIButton or a UIBarButtonItem in the Storyboard
    @IBAction func toggleBoolean(sender: AnyObject) {
        closureToPerform?()
    }

}

3. Стиль протокола-делегата

Здесь мы делаем наш первый контроллер представления совместимым с каким-то протоколом и передаем ему слабую ссылку на второй контроллер представления.

3.1. Создайте собственный протокол:

protocol MyDelegate: class {
    func changeValue()
}

3.2. Создайте подкласс UIViewController для первого контроллера представления и совместите его с предыдущим протоколом:

import UIKit

class ViewController1: UIViewController, MyDelegate {

    var currentUser = true {
        didSet {
            print(currentUser)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        currentUser = false
    }

    func changeValue() {
        currentUser = !currentUser
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let viewController2 = segue.destinationViewController as? ViewController2 {
            viewController2.delegate = self
        }
    }

}

3.3. Создайте подкласс UIViewController для второго контроллера представления:

import UIKit

class ViewController2: UIViewController {

    weak var delegate: MyDelegate?

    // Link this IBAction to a UIButton or a UIBarButtonItem in the Storyboard
    @IBAction func toggleBoolean(sender: AnyObject) {
        delegate?.changeValue()
    }

}

Ответ 3

Добавьте атрибут currentUserSecondVC в контроллер представления назначения и используйте prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "Name Of Your Segue" {
        var vc = segue.destinationViewController as NameOfTheSecondViewController
        vc.currentUserSecondVC = !currentUser //you can do whatever you want with it in the 2nd VC
    }
}

Ответ 4

Функция, которая должна быть определена как переопределение:

open func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "Segue Name Defined In Storyboard") {
        //set the property of the designated view controller with the value you need
    }
}

Ответ 5

Поскольку вы используете одну и ту же переменную для двух Viewcontrollers, а именно currentUser (тип Bool).

Поэтому лучше сделать его глобальной переменной в обоих классах.

При переходе к глобальной переменной в быстрой версии.

Все по умолчанию в swift является общедоступным, и, таким образом, если вы заявляете что-то вроде этого:

class FirstViewController: UIViewController {

    var someVariable: Boll = YES

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
}

Вы можете получить к нему доступ и установить значения, если у вас есть экземпляр:

var MySecondViewController: FirstViewController = FirstViewController(nibName: nil, bundle: nil)
var getThatValue = MySecondViewController.someVariable