簡體   English   中英

如何以編程方式鏈接此按鈕和此操作?

[英]How can I link this button and this action programmatically?

目前,我有兩個簡單的類,一個是容器視圖控制器,另一個是子視圖控制器。 我在ContainerViewController.swift文件中有一個操作,但是需要在HomeViewController.swift文件中調用它。 我顯然不能只調用ContainerViewController.presentDetailController(self) ,那么該如何處理呢?

ContainerViewController.swift

import UIKit

class ContainerViewController: UIViewController {

    var currentDetailViewController: UIViewController?

    override init() {
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    convenience init(viewController: UIViewController) {
        self.init()

        currentDetailViewController = viewController
        self.presentDetailController(viewController)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        var homeViewController: HomeViewController = HomeViewController.alloc()
        self.presentDetailController(homeViewController)
    }

    override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }

    func presentDetailController(detailViewController: UIViewController) {
        if((self.currentDetailViewController) != nil) {
            self.removeCurrentDetailViewController();
        }

        self.addChildViewController(detailViewController)

        detailViewController.view.frame = self.frameForDetailController()

        self.view.addSubview(detailViewController.view)
        self.currentDetailViewController = detailViewController

        detailViewController.didMoveToParentViewController(self)
    }

    func removeCurrentDetailViewController() {
        self.currentDetailViewController?.willMoveToParentViewController(nil)
        self.currentDetailViewController?.view.removeFromSuperview()
        self.currentDetailViewController?.removeFromParentViewController()
    }

    func frameForDetailController() -> CGRect {
        var detailFrame: CGRect = self.view.bounds

        return detailFrame
    }

}

HomeViewController.swift

import UIKit

class HomeViewController: UIViewController {

    func initView () {
        self.view.backgroundColor = UIColor.redColor()
        var button: UIButton = UIButton(frame: CGRectMake(20, 20, 50, 50))
        button.backgroundColor = UIColor.greenColor()
        button.addTarget(self, action: Selector("ContainerViewController.presentDetailController(self)"), forControlEvents: UIControlEvents.TouchDown) // This results in a fatal error!
        self.view.addSubview(button)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        initView();
    }
}

我認為我們只能使用委托將消息傳遞回父視圖控制器。 可能還有其他方法,但這是唯一的優雅方法。

方法-1

1)

創建協議並在父視圖控制器中實現

@interface ParentController : UIViewController <NaviagationDelegate>

@implementation ParentController
//implement method here
//{
// your action in parent controller
//}

2)

現在使用NaviagationDelegate在子控制器中創建屬性

@property (nonatomic, weak) id <NaviagationDelegate> navigationDelegate;

在子控制器的事件操作上調用委托方法

    //Button action method
    {
        [self.navigationDelegate setText:@"action"];
    }

3)在父視圖控制器中將子控制器的委托屬性初始化為self

prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.destinationViewController isKindOfClass:[ChildContoller class]])
    {
        [segue.destinationViewController setNavigationDelegate:self];
    }
}

方法-2

通過檢查從self.navigationController.viewControllers到parentController的類的所有控制器,只需獲取父控制器的引用即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM