【问题标题】:IBoutlet and IBAction in a separated class to decompose an UIViewControllerIBoutlet 和 IBAction 在一个单独的类中分解一个 UIViewController
【发布时间】:2014-09-10 08:23:13
【问题描述】:

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

在这个视图中,有很多@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,因为我的 Storyboard 中的视图所有者是 MyViewController class

谢谢!

【问题讨论】:

  • 你可以使用扩展
  • 您可以为 IBAction 使用扩展,但不能用于 IBOutlet。
  • 不,很遗憾你不能。

标签: ios swift storyboard ibaction iboutlet


【解决方案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. 在场景中选择视图控制器(例如 MyViewController)并转到 Connections Inspector。
  4. 从buttonsManager Outlet 连接到场景中的ButtonsManager 对象
  5. 在场景中再次选择 ButtonsManager 对象并转到 Connections Inspector。
  6. 您会在此处找到所有出口和收到的操作。像往常一样将它们连接到您的视图。 IE。通过从出口/动作拖动到相应的视图元素来建立连接。

编译!

编辑:

更好的解决方案可能是在 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()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多