gpt4 book ai didi

ios - Swift 委托(delegate)函数未被执行

转载 作者:行者123 更新时间:2023-11-28 08:39:39 25 4
gpt4 key购买 nike

我有一个包含三个 ViewController 的 UIPageViewcontroller。一个 Viewcontroller 是我的 ProfileViewcontroller。我的 ProfileViewController 中有一个按钮,按下时应该告诉 UIPageViewCongtroller 切换到下一个 Viewcontroller。这是我第一次实现委托(delegate),但我不明白为什么它不起作用。

UIPageViewController类:

class PageViewController: UIPageViewController, ProfileViewControllerDelegate {

private(set) lazy var orderedViewControllers: [UIViewController] = {


// The view controllers will be shown in this order
return [self.newColoredViewController("Search"),
self.newColoredViewController("Menu"),
self.newColoredViewController("Profile"),
self.newColoredViewController("Offer")]
}()

override func viewDidLoad() {
super.viewDidLoad()

dataSource = self



if orderedViewControllers.count >= 2 {
scrollToViewController(orderedViewControllers[1])
}

}

// MARK: ProfileViewControllerDelegate
func profileViewControllerDidTouchOffer(viewController:ProfileViewController, sender: AnyObject) {
scrollToNextViewController()
print("I'm pressing the offer Button")
}

ProfileViewController 类:

protocol ProfileViewControllerDelegate : class {
func profileViewControllerDidTouchOffer(controller: ProfileViewController, sender: AnyObject)
}

class ProfileViewController: UIViewController {

weak var delegate: ProfileViewControllerDelegate?

@IBOutlet var profileImageView: SpringImageView!
@IBOutlet var offerButton: UIButton!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func offerButtonTouchUpInside(sender: AnyObject) {

delegate?.profileViewControllerDidTouchOffer(self, sender: sender)

}

回答

我通过更改在 orderderedViewControllers 中添加 ViewControllers 的方式更新了 PageViewController 类:

private(set) lazy var orderedViewControllers: [UIViewController] = {
// The view controllers will be shown in this order

let profileVC = UIStoryboard(name: "Main", bundle: nil) .instantiateViewControllerWithIdentifier("ProfileViewController") as! ProfileViewController
profileVC.delegate = self

return [self.newColoredViewController("Search"),
self.newColoredViewController("Menu"),
profileVC,
self.newColoredViewController("Offer")]
}()

最佳答案

看起来你正在使用 InterfaceBuilder,所以我不确定它是如何在那里完成的(可能在 prepareForSegue 中),但典型的模式是这样的:

let vc = ProfileViewController() 
vc.delegate = self // Or whatever you want to act as the delegate
// Now show the view controller.

关键是在使用 View Controller 之前,确保它的 delegate 属性设置为委托(delegate)并符合协议(protocol)。通常调用 Controller 是委托(delegate)。

编辑:如果您使用的是 UIPageViewController,那么您应该在将委托(delegate)传递给 setViewController 之前将其添加到 viewController https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPageViewControllerClassReferenceClassRef/#//apple_ref/occ/instm/UIPageViewController/setViewControllers:direction:animated:completion :

关于ios - Swift 委托(delegate)函数未被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36724168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com