【问题标题】:Objective-C category calling method of a custom class自定义类的Objective-C类调用方法
【发布时间】:2014-08-20 23:18:54
【问题描述】:

我有一些类,我们称它们为 A、B 和 C,它们继承自 UIViewController 和一些 UIViewController 类别,其中包含一些必须对所有类通用的方法。
Category 的方法必须调用 ViewControllers 上的另一个方法,但是。并非所有方法都将在 VC 中实现(因为它们永远不会在该上下文中被调用)。
如果我在类别中编写方法定义,则会收到错误,该方法未声明,但它已在 VC 中声明或未声明,并且永远不会在该上下文中使用。
是否有任何想法如何覆盖它并在多个 ViewController 之间共享大部分代码(导航代码)?

- (void)homeButtonPressed {
    NSLog(@"Home button pressed, ViewController");
}

- (void)changeFloorButtonPressed {
    [self changeFloor];
    NSLog(@"Change Floor button pressed, ViewController");
}
- (void)QRButtonPressed {
    NSLog(@"QR button pressed, ViewController");
}  

这里[self changeFloor];是方法,它只针对一个ViewController。

【问题讨论】:

  • 将通用代码抽象到不同的类中
  • 好的,但是,我怎样才能调用每个 VC 独有的方法?
  • 你能展示一些示例代码吗?
  • @BryanChen 将代码示例添加到问题中
  • 为什么你需要一个类别中的方法来调用另一个可能无法实现的方法?将第一个方法放入实现第二个的类中。

标签: ios objective-c uiviewcontroller objective-c-category


【解决方案1】:

为什么要创建 UIViewController 类型的基类,然后创建从新基类继承的类。然后每个孩子都可以实现他们需要的方法。

MyBaseViewController: UIViewController

ViewAViewController: MyBaseViewController

ViewBViewController: MyBaseViewController

我将这种方法用于通用应用程序,我的子类可以覆盖父类的实现或添加到它。

// 常用元素 主视图控制器:UIViewController

// iPhone具体实现 HomeViewController_iPhone : HomeViewController

// iPhone具体实现 HomeViewController_iPad:HomeViewController

【讨论】:

  • 是的,我认为,像您描述的那样实施解决方案是个好主意。虽然,它不是我想要的 100%,但它似乎没问题。
【解决方案2】:

创建一个objective-c协议,为-(void)changeFloor;声明一个@optional方法 然后,在您的类别中,遵守该协议。您将能够调用 changeFloor 方法而不会出现编译错误。

由于该方法是可选的,因此您必须检查是否:

[self respondsToSelector:@selector(changeFloor)] 在调用 changeFloor 之前。

编辑:可能有一种方法可以构建您的代码,这样您就不需要这样做了。

【讨论】:

    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多