2017-07-30 9 views
0

デリゲートを使用してあるクラスから別のクラスにデータを送信しようとしています。ストーリーボードを使用しないクラス間でデータを渡す(委任)

私は、このクラスでデリゲートを設定します。

class AnswerViewController: UIViewController, tagToIndexDelegate{  
override func viewDidLoad() { 
    super.viewDidLoad() 
    getDictionary() 
} 

func getDictionary() { 
    let myCell = MyCell() 
    myCell.delegate = self 
    print(123) 
} 

func finishPassing(dictionary: Dictionary<Int, Int>) { 
    print(dictionary) 
} 
} 

そして、このクラスでデリゲートを介してデータを取得する:

protocol tagToIndexDelegate: class { 
func finishPassing(dictionary: Dictionary<Int,Int>) 
} 

class MyCell: UITableViewCell, YSSegmentedControlDelegate{ 

var delegate: tagToIndexDelegate? 

func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt  index: Int) { 

    tagToIndex[actionButton.tag] = index 
    delegate?.finishPassing(dictionary: tagToIndex) 

}  
} 

私は印刷するdictionary値を取得することができていませんAnswerViewControllerクラス。 AnswerViewControllerは確実に動作しています。なぜなら、このビューコントローラにボタンを押してprintステートメントが実行されると(ボタンが押されるまで、AnswerViewControllerのインスタンスは作成されないためです)。

私はこのプロジェクトでストーリーボードを使用していないことに留意する必要があります。そうでない場合は、ストーリーボードセグーと一緒にデリゲートを使用してタスクを完了できます。

+0

デリゲートの前にブレークポイントを追加すると、?.finishPassing(dictionary:tagToIndex)をチェックして、answerViewControllerがデリゲートとして正しく割り当てられているかどうかを確認できます。この時点でtagToIndexに含まれている内容を確認してください。試してみて、結果を教えてください。 – 3stud1ant3

+0

「MyCell」はUITableViewにあるはずですか?デリゲートを 'cellForRowAt:'に配置する場所を設定する必要があります。 – Paulw11

+0

@ Paulw11それを試しましたが、実際にはうまくいきました。問題は、 'cellForRowAt'のデリゲートを設定した後、' tagToIndex'にアクセスするためにスタブを使用できる唯一の場所が 'TableViewController'クラスの中にあることです。これは、私が 'answerViewController'に' tagToIndex'を必要としていると考えるとあまり役に立ちません。私は何か基本的なことを逃しているかもしれない、私はこれにかなり新しいです。 –

答えて

0

何かがここで間違っている:あなたはtagToIndex[actionButton.tag] = index,を更新しているが、それは戻って格納していない

func segmentedControl(_ segmentedControl: YSSegmentedControl, willPressItemAt  index: Int) { 

    tagToIndex[actionButton.tag] = index 
    delegate?.finishPassing(dictionary: tagToIndex) 

} 


これが役に立ちますようお願いいたします。

+0

これは問題のようです。どのように私はこれを修正するかもしれないかに関する任意のアイデア? –

関連する問題