【问题标题】:UINavigationBar with Category, Act as Button too带有类别的 UINavigationBar,也充当按钮
【发布时间】:2010-08-17 17:25:20
【问题描述】:

在我的 iphone 应用程序中,我试图让我的 uinavigationbar 充当一个按钮,我的意思是当我触摸它时做一些事情。不是任何导航项目的后退按钮,栏本身。 这是我如何“分类”它的:

@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
    UIColor *color = [UIColor blackColor];
    UIImage *img    = [UIImage imageNamed: @"bar.png"];
    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    self.tintColor = color;
}

该操作将导航到某个视图..
有什么想法吗?
提前致谢!

【问题讨论】:

  • 我使用了一个类别,因为我认为我是实现 UINavigationBar 自定义的唯一方法。

标签: iphone cocoa-touch button uinavigationbar


【解决方案1】:

不要使用类别来覆盖类中的方法。来自Objective-C Programming Language 指南:

虽然目前语言允许 你使用一个类别来覆盖 类继承的方法,甚至 类中声明的方法 界面,你强烈 不鼓励使用这个 功能。一个类别不是一个 替代子类。有 几个显着的缺点:

  • 当一个类别覆盖一个继承的 方法,类别中的方法 可以像往常一样调用继承的 通过给 super 的消息实现。 但是,如果一个类别覆盖了一个 已经存在的方法 类别的类,没有办法 调用原始实现。

  • 类别不能可靠地覆盖 在另一个类别中声明的方法 属于同一类。这个问题是 特别重要,因为许多 Cocoa 类已实现 使用类别。框架定义的 您尝试覆盖的方法可能本身 已在一个类别中实施, 等等实现需要 优先级未定义。

  • 某些方法的存在可能 导致所有人的行为改变 构架。例如,如果您添加一个 windowWillClose: 的实现 NSObject,这将导致所有窗口 代表响应该方法 并且可能会修改所有人的行为 NSWindow 实例的实例。这 可能会引起神秘的变化 行为并可能导致崩溃。

相反,您最好创建一个响应触摸的透明视图或按钮,并将其放置在 UINavigationController 的栏区域上方。然后,此透明视图可以捕获针对整个条形区域的触摸事件。

但是,我会认真考虑您要通过此实现的目标。从内置界面元素覆盖标准用户交互可能会导致用户感到沮丧,甚至可能被 Apple 拒绝。

【讨论】:

  • 原则上你是对的,但在这个特定的设备中,我想说一个类别很好。 Nicolas 似乎对 Cocoa Touch 不太熟悉,根据 drawRect:-method 判断,几乎没有其他功能可以搞砸,根据我的经验,子类化 UINavigationBar 相当很棘手。
  • 好的,太好了!我会看看我能用这两个答案做些什么。 PS。我没有使用 Cocoa Touch 的经验。不过我会尽力而为。
  • @eliego - 在这种情况下,不需要子类化。他只需在屏幕的导航栏部分放置一个透明视图或按钮,并让其处理触摸。提倡 Apple 明确警告过的做法并不是让新开发人员开始使用该平台的正确方法。您希望人们在第一次学习环境时养成良好的习惯。
  • 好的,我完成了这个!感谢布拉德和 eliego!我最后只是在 uinavbar 中添加了一个 imageView 作为子视图,添加了色调并删除了类别。效果很好,但不是触摸处理。我不会使用它,因为我无法将 uibutton 添加为子视图,我会显示但它不会做任何事情,甚至不会突出显示。再次感谢!
【解决方案2】:

【讨论】:

  • 谢谢我试一试再回来!
  • 好的,所以我应该使用这 3 个函数: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 我对重写的工作方式很陌生,所以请友好..我必须在里面写我的代码,还是我有也对参数做点什么?感谢您的快速回复!编辑:好的,我放弃了,不知道如何在此处的评论中添加代码标签..
  • 首先在您的类别中实现它们(与您使用 drawRect 的方式完全相同:),并输出一些 NSLog 以了解它们是如何被调用的。最后,您可能只需要向 touchesEnded:-method 添加代码,然后执行您想要的任何操作。
  • 好的,太好了!谢谢。顺便说一句,我把这个问题留着,所以如果我有任何问题,我可以回复你。
  • 类别不是定位自定义触摸处理代码的正确位置。有关更多信息,请参阅我的答案。
猜你喜欢
  • 2015-08-05
  • 2012-09-22
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多