Swift: контроллер TableView и изменение значения сегмента

Я надеюсь, что вы можете помочь мне в этом вопросе, поскольку я немного застрял...

В моем приложении у меня есть простой контроллер TableView с парой пользовательских ячеек-прототипов.

В одной из ячеек пользовательского прототипа у меня есть элемент управления сегментом с двумя значениями (в моем случае это температурные шкалы F/C).

Все отображается нормально, я могу изменить значения (используя действие изменения значения), но проблема возникает, когда я хочу «отправить» этот выбор другому ViewController (через переход) из контроллера TableView (например, вернуться к предыдущему отображаемому контроллеру и это значение будет использоваться для отображения температуры на правой шкале внутри метки).

Если у меня есть переменная в пользовательской ячейке прототипа (userSelection), она недоступна в классе tableview.

Если я перенесу действие «изменение значения» на контроллер tableview, я, кажется, «потеряю» возможность отслеживать, что изменилось.

Мне не хватает чего-то, что "склеивает" их вместе...

Большое спасибо!

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var button1: UIButton!
    @IBAction func pressButton1(sender: AnyObject) {
    }
}


class TableViewController: UITableViewController {
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return 1
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! UITableViewCell
        var cell = tableView.dequeueReusableCellWithIdentifier("customcell") as! TableViewCell
        return cell
    }

    class TableViewCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBOutlet weak var segment1: UISegmentedControl!

    @IBAction func segmentValueChanged(sender: AnyObject) {
        var userSelection = segment1.selectedSegmentIndex
    }
}

person Kostas    schedule 07.05.2015    source источник
comment
Вам нужно отслеживать статусы нескольких сегментов или только один?   -  person József Vesza    schedule 07.05.2015


Ответы (1)


Если вам нужно информировать только один другой экземпляр за раз, вы можете использовать шаблон делегирования:

Определите протокол делегата:

protocol TableViewCellSegmentDelegate {
   func segmentValueChanged(sender: UISegmentedControl)
}

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

class TableViewCell: UITableViewCell {
    var delegate: TableViewCellSegmentDelegate?

    @IBAction func segmentValueChanged(sender: UISegmentedControl) {
        if let delegate = delegate {
            delegate.segmentValueChanged(sender)
        }
    }
}

В табличном представлении в tableView(_:cellForRowAtIndexPath:):

let cell = tableView.dequeueReusableCellWithIdentifier("customcell") as! TableViewCell
cell.delegate = self
return cell

Реализуйте протокол в виде таблицы:

extension TableViewController: TableViewCellSegmentDelegate {
    func segmentValueChanged(sender: UISegmentedControl) {
        // do something with `sender.state`
    }
}

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

person József Vesza    schedule 07.05.2015