2017-05-03 11 views
-2

デリゲートを作成しましたが、これは正しく動作しませんでした。私はどこが間違っているのか分かりませんデリゲートが動作しません

protocol MenuDelegate { 
    func upateUserProfileImage() 
} 

// Userprofile view 
class UserProfileViewController: UIViewController { 
    var delegate : MenuDelegate? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate?.upateUserProfileImage() 
    } 

} 

class MenuViewController: UIViewController, MenuDelegate { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
    } 
    func upateUserProfileImage() { 
     print("Work!") 
    } 
} 

ありがとうございました!

+4

をリリースしたことがないであろう、どこデリゲートを設定されているオブジェクト:MenuViewController、あなたはweak VARを使用する必要がありますか? – Larme

答えて

3

UserProfileViewControllerを提示していた場合は、代理人を設定する必要があります(例:self.delegate)。 UserProfileViewController

この例では
func openUserProfileViewController() { 
    let userProfileViewController = UserProfileViewController() 
    userProfileViewController.delegate = self 
    present.... 
} 

self.delegate nilでないため、デリゲートは、コードのあなたの束にsettedされることはありません戻ってあなたのVCに

0

を呼び出します。

あなたは

guard let del = self.delegate else { 
print("delegate is not setted - nil value") 
} 

del.upateUserProfileImage() 

によって

self.delegate?.upateUserProfileImage() 

を置き換えることによって、あなたはUserProfileViewControllerを押すところ、このようなあなたのデリゲートを設定する必要があることを表示されることがあります。

let userProfile: UserProfileViewController = UserProfileViewController() // or your instance already init 
userProfile.delegate = MenuViewController() // or the instance already init somewhere in your code 

ボーナス:のように注意してくださいUserProfileViewControllerとデリゲートの間の保持期間、あなたがメモリリークを持っていることがあり、それがなければ

class UserProfileViewController: UIViewController { 
    weak var delegate : MenuDelegate? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate?.upateUserProfileImage() 
    } 

} 

/ゾンビ

+0

こんにちは!返信いただきありがとうございます。私のinit関数の例をお願いしますか? –

+0

@StefanoToppiワークフローやコード内でオブジェクトを初期化する方法がわからないので、私はできません。しかし、 "私のコードで私の代理人を設定する場所"に注目してください。私はあなたが 'MenuVC'と' UserProfileVC'の両方を初期化してここに一致させるかどうかを確認することをお勧めします。 – jlngdt

+0

ok infact私はこのステップを理解しません。 let userProfile:UserProfileViewController = UserProfileViewController()//あなたのインスタンスはすでに初期化されています userProfile.delegate = MenuViewController()//コード のどこかで既にインスタンスが初期化されていて、userProfile –