IBoutlet和IBAction在一个单独的类中分解UIViewController

时间:2014-09-10 08:23:14

标签: ios swift storyboard ibaction iboutlet

在我的故事板中,我有一个与名为MyViewController的类链接的ViewController。

在这个视图中,有很多@IBOutlet@IBAction,我知道是否可以用包含@IBOutet和@IBAction的分隔类来分解这个ViewController。

例如:

class MyViewController
{
    @IBOutlet var button1 : UIButton!
    @IBOutlet var button2 : UIButton!
    ...
    @IBOutlet var button10 : UIButton!

    @IBAction func clickOnButton1(sender : AnyObject!)
    {
        ...
    }

    @IBAction func clickOnButton2(sender : AnyObject!)
    {
        ...
    }

    ...

    @IBAction func clickOnButton10(sender : AnyObject!)
    {
        ...
    }
}

会......

class MyViewController
{
    let buttonsManager = ButtonsManager()
}

class ButtonsManager
{
    @IBOutlet var button1 : UIButton!
    @IBOutlet var button2 : UIButton!
    ...
    @IBOutlet var button10 : UIButton!

    @IBAction func clickOnButton1(sender : AnyObject!)
    {
        ...
    }

    @IBAction func clickOnButton2(sender : AnyObject!)
    {
        ...
    }

    ...

    @IBAction func clickOnButton10(sender : AnyObject!)
    {
        ...
    }
}

但问题是,如何将按钮IBOutletIBAction关联到ButtonsManager class,因为我的故事板中的视图所有者是MyViewController class

谢谢!

1 个答案:

答案 0 :(得分:1)

免责声明:我不知道这是否是推荐的做法,但我认为这是一个有趣的问题。无论哪种方式,我想出了这个解决方案,至少有效。如果你想做什么,请自己决定。

首先让你的ButtonsManager成为NSObject的子类。这样我们就可以将ButtonsManager的一个实例变成一个IBOutlet本身。

class ButtonsManager: NSObject {
    @IBOutlet var button1 : UIButton!
    @IBAction func clickOnButton1(sender : AnyObject!) {
        print("hello world!")
    }
}

我为按钮添加了一个插座,还有一个动作打印了#hello world!"。基本上,您可以将所有@IBOutlets和@IBActions移动到此类中。

在视图控制器类中,添加一个类型为ButtonsManager的@IBOutlet:

class MyViewController {

    @IBOutlet var buttonsManager: ButtonsManager?

    // rest of class
}

剩下的就是在Interface Builder中挂钩:

  1. 添加通用"对象"从对象库到场景的项目。
  2. 在Identity Inspector中,将其自定义类设置为" ButtonsManager"
  3. 选择场景中的View控制器(例如MyViewController)并转到Connections Inspector。
  4. 从buttonsManager Outlet连接到场景中的ButtonsManager对象
  5. 在场景中再次选择ButtonsManager对象,然后转到Connections Inspector。
  6. 您将在此处找到所有商店并接收行动。像往常一样将它们连接到您的视图。即通过从插座/操作拖动到相应的视图元素来建立连接。
  7. 编译!

    编辑:

    更好的解决方案可能是在ButtonsManager类中引用视图控制器,而不是相反。这样可以更轻松地从IBAction方法访问视图控制器类。作为奖励,您的视图控制器类中没有@IBOutlet关键字。

    请记住在Interface Builder中更改连接。也就是说,删除MyViewController上的连接,并将ButtonsManager上的连接从myViewController插座添加到场景中的MyViewController对象。

    class MyViewController {
    
        var testString = "Hello world!"
    
        func testMethod() {
            print("Printing some other string here!")
        }
    
        // rest of class
    }
    
    class ButtonsManager: NSObject {
        @IBOutlet var myViewController : MyViewController!
        @IBOutlet var button1 : UIButton!
        @IBAction func clickOnButton1(sender : AnyObject!) {
            print(self.myViewController.testString)
            self.myViewController.testMethod()
        }
    }