创建UIViewController的子类

时间:2015-05-23 13:16:46

标签: ios uiviewcontroller subclassing

我有一个关于子类/usr/local/rvm/rubies/ruby-2.2.2/bin/ruby -r ./siteconf20150523-10092-2alrq5.rb extconf.rb --with-sqlite3-dir=/opt/local 的基本问题,但似乎无法在这里找到答案。我的应用有UIViewControllers,我计划有几个视图(按顺序)。我的第一个UINavigationViewController是自定义ViewController ViewControllerUITableViewDatePicker视图等。

我想对所有后续视图使用相同的UIPickerController(我猜一个子类?)。我想使用我在故事板中构建的相同布局。目前我的代码的布局是这样的,在ViewController中,我从plist读取一个数组,并填充表和内容的其余部分。

您可以想象,我正在尝试避免复制粘贴,重复代码以及同时更改所有视图的简便方法。

我知道这应该是微不足道的,但我无法弄清楚我需要做出哪些改变。另外,我应该用xib创建viewDidLoad吗?有没有办法将我的ViewController拖到Xcode右侧显示的列表中?

2 个答案:

答案 0 :(得分:1)

我认为你应该创建一个基础'视图控制器将收集所有重复的方法和属性。它将继承自UIViewControll,但所有其他控制器将继承自base。

相同的视图你可以在故事板中复制粘贴并连接基类中的插座,但是如果你需要改变一些东西就会出现问题..所以我建议你以编程方式创建它(我认为xibs已经是过去),或将其替换为另一个小视图控制器,然后使用视图控制器的容器来加载它。 enter image description here

如果你有一些重复但不在每个控制器中的东西,你可以在基类中创建自己的选项,如下所示:

typedef NS_OPTIONS(NSUInteger, BaseOptions) {
    BaseOptionsNone          = 0,
    BaseOptionsTableView     = 1 << 0,
    BaseOptionsDatePicker    = 1 << 1,
    BaseOptionsSomethingElse = 1 << 2
};

@interface BaseViewController : UIViewController

@property (nonatomic) BaseOptions options;

@end

@implementation BaseViewController

- (void)setOptions:(BaseOptions)options {
    _options = options;

    if (self.options & BaseOptionsTableView) {
        // add table view
    }
    if (self.options & BaseOptionsSomethingElse) {
        // another staff
    }
}

@end

然后将选项设置为子类:

@interface CustomViewController : BaseViewController

@end

@implementation CustomViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.options = BaseOptionsTableView | BaseOptionsSomethingElse;
}

@end

玩得开心:)

答案 1 :(得分:0)

在我看来,您可以创建一个viewController作为根视图控制器,您可以在其中实现公共视图,操作等。然后,创建rootViewController的其他viewController子类。

在rootViewController中,您可以编写一些常用代码,包含或不包含xib。这都是你的家属。这是一个简单的例子:

//Your RootViewController.
class rootViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button:UIButton = UIButton(frame: CGRectMake(10, 10, 200, 90))
        button.backgroundColor = UIColor.redColor()
        button.addTarget(self, action: "testButton:", forControlEvents: UIControlEvents.TouchUpInside)
        view.addSubview(button)
    }

    func testButton(button:UIButton) {
        // Some Common Code. or just keep blank.
        println("parents")
    }

}


// Your ChildrenViewController.
class childrenViewController: rootViewController {
    override func testButton(button:UIButton) {
        super.testButton(button)
        // Some code only for this children view controller.
        println("children")
    }
}

因为childrenViewController是rootViewController的子类,所以rootViewController的所有函数都对它有效。所以childrenViewController会自动在框架(10,10,200,90)中显示一个redButton。如果你按下按钮,这将打印“父母”和“孩子”。

希望它可以帮助你。