2017-07-22 12 views
-1

私は現在、デリゲートを使用して別のビューコントローラに(既にデリゲート内にある)変数を渡す必要があるプロジェクトに取り組んでいます。ネストされたデリゲート/デリゲート内のviewDidLoad()の実装

私は前述のMyCellクラスは、デリゲートが含まれている拡張子を持つ個々のセル

class MyTableViewController: UITableViewController { 


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if indexPath.row == 4 { 
    let answerViewController = AnswerViewController() 
    navigationController?.pushViewController(answerViewController, animated: true) 
    } 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
     var items = ["Item 1","Item 2","Item 3","Item 4"] 

    let cell1: MyCell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! MyCell 


    return cell1 
    } 
} 

をレイアウトするMyCellというカスタムクラスを実装MyTableViewと呼ばれるTableViewを持っています。このデリゲートの中で、私はAnswerViewController

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

    //Modifying Variable Tag To Index 
    tagToIndex[actionButton.tag] = index 

    //Passing Variable to Delegate 
    delegate?.finishPassing(dictionary: tagToIndex) 

} 
} 

と呼ばれるビューコントローラに渡すしたいtagToIndexという変数があるビューがセットアップである方法がtagToIndex値に依存し、私は内viewDidLoad機能を実装したいですデリゲート。私はtagToIndex条件が満たされたら(if-elseステートメントが表示されていない)ビューを特定の方法で設定するために、デリゲート関数で一連のif-elseステートメントを使用します。

class AnswerViewController: UIViewController, TagToIndexDelegate { 

// Accessing the variable tagToIndex passed through the delegate 
func finishPassing(dictionary: Dictionary<Int, Int>) { 
    func viewDidLoad() { 
     super.viewDidLoad() 
     view?.backgroundColor = UIColor(white: 240.0/255.0, alpha: 1) 
} 
} 

また、tagToIndexDelegateというプロトコルも作成しましたが、ここに投稿する必要はありません。 (私はfoo.delegate = selfを置かない、すなわち場所)

  • 私は実際にこのようなデリゲートでviewDidLoad()を実装することができます

    • 私は先のデリゲートを設定します:私は2つの質問がありますか?もしそうなら、この適切な練習ですか?私は先のデリゲートを設定するのです
  • +0

    適切な方法を確認するために取得する前に、彼らが実行されます。これは何が恩恵を受けていますか? 。 'viewDidLoad'関数なしで' finishPassing'を実装するときに違いはありますか? –

    +0

    達成しようとしているもの。あなたが使っている複雑な方法ではなく、簡単な方法をあなたに提案することができます。 – luckyShubhra

    +0

    'tagToIndex'は、一連のセグメント化されたコントロールを追跡します。 'answerViewController'は、これらのセグメント化されたコントロールのステータス(したがって' tagToIndex')によって異なって見えます。これは本質的には質問/回答アプリなので、UILabelを持つ 'tableView'コントローラと、行ごとに1つの「yes」または「no」セグメント化されたコントロールがあります。ユーザーがセグメント化されたコントロールを特定の順序で選択すると、アプリケーションは「answerViewController」に進みます。レイアウトはどの質問に「はい」または「いいえ」と答えたかによって異なります – indiankid97

    答えて

    0

    は(つまりはどこに置くかfoo.delegate = self

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
         var items = ["Item 1","Item 2","Item 3","Item 4"] 
    
        let cell1: MyCell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! MyCell 
        //set the destination's delegate 
        cell1.delegate = self 
        return cell1 
        } 
    } 
    

    私は実際にこのようなデリゲートでviewDidLoad()を実装することはできますか?もしそうなら、この適切な練習ですか?

    viewDidLoad()は決して実行されないため、viewDidLoad()を実装できません。 viewDidLoadまたはviewWillAppearユーザーがデリゲート内 `viewDidLoad`機能を実装したい理由ビュー これに

    class AnswerViewController: UIViewController, TagToIndexDelegate { 
    
    // Accessing the variable tagToIndex passed through the delegate 
    func finishPassing(dictionary: Dictionary<Int, Int>) { 
         //background view automatic change don't worry about that 
         view?.backgroundColor = UIColor(white: 240.0/255.0, alpha: 1) 
    } 
    
    +0

    私はこのことについて簡単に説明しました。問題は、実装しようとすると、Xcodeは 'cell1.delegate = self'を' cell1 'に修正することです。デリゲート=自己として! TagToIndexDelegate'。なぜそれがダウンキャスティングであるのか分からないが、理由が何であれ、代理人が適切に働くのを止めるようだ。 – indiankid97

    +0

    @ indiankid97セル内で 'delegate'を宣言する方法 –

    +0

    ' cellForRowAt'関数の外観はどういう意味ですか? – indiankid97

    関連する問題