2016-03-16 2 views
0

Здравствуйте, изучите быстро и застрял в вызове метода через делегата. Проверял несколько ответов с аналогичными проблемами и пробовал решения, но не смог успешно применить их к моей собственной ситуации, но я близок.Swift 2 - метод, который не вызван через делегата

У меня есть класс делегата с именем ViewController, который содержит переменную, которую я хотел бы изменить. У меня есть другое представление под названием MoodScroll, которое выполняет функции делегата. Moodscroll имеет кнопку, которая используется для изменения значения переменной в ViewController.

ViewController:

class ViewController: UIViewController, AVAudioPlayerDelegate, MoodScrollDelegate { 

    var alarmSoundType: String? 

    func acceptData(data: String?) {   
     alarmSoundType = "\(data)" 
     print(data) 
    } 
} 

MoodScroll:

protocol MoodScrollDelegate { 
    func acceptData(data: String?) 
} 

import UIKit 

class MoodScroll: UIViewController { 
    @IBAction func WTF(sender: AnyObject) { 
     self.delegate?.acceptData("hello") 
     print("function called") 
    } 
} 

IBAction называет штраф, как он печатает "функция называется" в консоли, однако он не пропускает значение ViewController поскольку alarmSoundType остается равным нулю, а также команда print не вызывается в ViewController.

+0

Где вы объявляете Объект MoodScoll в классе ViewController? – iMuzahid

+1

проверить, если self.delegate равен нулю, прежде чем вы его вызываете, иначе вы не назначили делегата должным образом – Fonix

ответ

0

Кажется, вы все еще есть некоторая путаница относительно делегирования: если ViewController соответствует MoodScrollDelegate протоколу, то ваш ViewController объект будет делегатом, не MoodScroll объекта.

Где вы задаете delegate объект недвижимости MoodScroll?

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

    myMoodScrollObject.delegate = self 
    
  • Является ли объект создан с помощью Interface Builder, вы можете использовать переменную выпускную для delegate, или установить его в prepareForSegue:sender вашего ViewController класса:

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

Одна придирчивая записка: как вы описали свою проблему, на самом деле это ViewController, что вы должны назвать делегатом от MoodScroll. Скорее всего, вы, вероятно, забываете установить свойство делегирования MoodScroll.

Я не знаю, как эти два вид контроллеры связаны друг с другом в вашем коде, но очень часто вы бы установить свойство делегата в prepareForSegue методе ViewController, например:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "SegueToMoodScroll" { 
     let moodScrollController = segue.destinationViewController as! MoodScroll 
     moodScrollController.delegate = self 
    } 
} 
Смежные вопросы