- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过设置 NSProxy 子类来代替我选择的任何 UIView,向我的 UIView 添加功能(根据状态配置 CALayers)。这是我尝试过的:
在我的 NSProxy 子类中,我有以下代码:
#pragma mark Initialization / Dealloc
- (id)initWithView:(UIView *)view
{
delegate = view;
[delegate retain];
return self;
}
- (void)dealloc
{
[delegate release];
[super dealloc];
}
#pragma mark Proxy Methods
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
[anInvocation setTarget:delegate];
[anInvocation invoke];
return;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
return [delegate methodSignatureForSelector:aSelector];
}
- (BOOL)respondsToSelector:(SEL)aSelector
{
BOOL rv = NO;
if ([delegate respondsToSelector:aSelector]) { rv = YES; }
return rv;
}
并且,以这种方式使用我的 NSProxy 子类:
UILabel *label = [[HFMultiStateProxy alloc] initWithView:[[[UILabel alloc] initWithFrame:cellFrame] autorelease]];
label.text = text;
label.font = font;
label.textAlignment = UITextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
label.opaque = NO;
[self addSubview:label];
在我点击 addSubview: 行之前似乎一直有效。
打开消息跟踪(instrumentObjcMessageSends(YES);)会显示之前每条消息的转发工作,直到addSubview:的深处,这一系列方法调用显示在日志中(此处显示的第一条消息是通过代理调用):
- UILabel UIView _makeSubtreePerformSelector:withObject:
- UILabel UIView _makeSubtreePerformSelector:withObject:withObject:copySublayers:
- CALayer CALayer sublayers
- NSMethodSignature NSMethodSignature methodReturnType
- NSMethodSignature NSMethodSignature _argInfo:
- NSMethodSignature NSMethodSignature _frameDescriptor
+ UILabel NSObject resolveInstanceMethod:
- UILabel NSObject forwardingTargetForSelector:
- UILabel NSObject forwardingTargetForSelector:
- UILabel NSObject methodSignatureForSelector:
- UILabel NSObject methodSignatureForSelector:
- UILabel NSObject class
- UILabel NSObject doesNotRecognizeSelector:
我收到以下错误:
2011-02-20 16:38:52.048 FlashClass_dbg[22035:207] -[UILabel superlayer]: unrecognized selector sent to instance 0x757d470
如果我不使用 NSProxy 子类而是使用 UILabel 子类(HFMultiStateLabel),它工作正常。以下是调用 addSubview: 后发生的消息跟踪(HFNoteNameControl 是标签的 super View ):
- HFNoteNameControl UIView addSubview:
- HFNoteNameControl UIView _addSubview:positioned:relativeTo:
- HFMultiStateLabel UIView superview
- HFMultiStateLabel UIView window
- HFNoteNameControl NSObject isKindOfClass:
- HFNoteNameControl NSObject class
- HFNoteNameControl UIView window
- UIWindow NSObject isKindOfClass:
- UIWindow NSObject class
- HFNoteNameControl UIView _shouldTryPromoteDescendantToFirstResponder
- HFMultiStateLabel UIView _isAncestorOfFirstResponder
- HFMultiStateLabel UIView _willMoveToWindow:withAncestorView:
- HFMultiStateLabel UIView _willMoveToWindow:
- HFMultiStateLabel UIView willMoveToWindow:
- HFMultiStateLabel UIView _makeSubtreePerformSelector:withObject:withObject:copySublayers:
- CALayer CALayer sublayers
- HFMultiStateLabel UIView willMoveToSuperview:
- HFMultiStateLabel UIView _unsubscribeToScrollNotificationsIfNecessary:
- HFMultiStateLabel UIView _makeSubtreePerformSelector:withObject:
- HFMultiStateLabel UIView _makeSubtreePerformSelector:withObject:withObject:copySublayers:
- CALayer CALayer sublayers
- CALayer CALayer superlayer
我可以验证使用 NSProxy 时是否成功调用了 -superlayer 之前的每个方法。由于某种原因,使用 NSProxy 时,将调用 UILabel 上的 super 层而不是 CALayer。也许某个地方有些困惑,UILabel 被插入到子层而不是 CALayer 中?
UIKit 是否会进行某种优化来绕过 NSProxy Hook 的正常机制?
PS 我只在模拟器中尝试过此操作,而不是在设备中。这种行为会有什么不同吗?
最佳答案
当我遇到这个问题时,我试图解决同样的问题 - 将 NSProxy 与 UIView (在我的例子中为 UITableViewCell)一起使用。我记录了对控制台的所有调用:
...
App[2857:c07] MyHeaderCell: --- method signature for: _unsubscribeToScrollNotificationsIfNecessary:
App[2857:c07] MyHeaderCell: --- _unsubscribeToScrollNotificationsIfNecessary:
App[2857:c07] MyHeaderCell: --- method signature for: _makeSubtreePerformSelector:withObject:
App[2857:c07] MyHeaderCell: --- _makeSubtreePerformSelector:withObject:
App[2857:c07] +[MyHeaderCell superlayer]: unrecognized selector sent to class 0x1331f8c
App[2857:c07] CRASH: +[SMSHeaderCell superlayer]: unrecognized selector sent to class 0x1331f8c
App[2857:c07] Stack Trace:...
它因无法识别的选择器
异常而崩溃。
通常情况下,首先会询问对象 - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
方法,当该方法返回时,它会调用 - (void)forwardInitation:(NSInvocau) *)在代理中调用
。这样我们就可以重定向消息。如果没有返回 NSMethodSignature
,则在对象上调用 doesNotRecognizeSelector:
方法。因此我们甚至会收到无法识别的选择器调用。
这适用于实例方法,但此崩溃是由类方法引起的,我们对此无权控制 - 对象本身未被调用(类被调用)。我想通过覆盖我的 NSProxy 子类的 getter 来强制运行时调用我的代理类,甚至是类方法
- (Class) class
{
return _myRealClass;
}
这不起作用。所以 NSProxy 不足以做到这一点。现在我正在尝试使用 NSObject 而不是 NSProxy 来实现所有所需的行为,因为 NSObject 有 + (BOOL)resolveClassMethod:(SEL)sel
方法,这可能很有用。一旦我发现 NSObject 是否更适合于此,我将编辑这篇文章。
//编辑
问题似乎在于,使用 NSProxy 时,在 UIView
上调用 superlayer
,而不是在 CALayer
上调用。
所以这看起来确实是一个 UIKit 快捷方式问题 - 他们没有发送常规消息调用(我猜是速度优化)。
无论如何,我现在正在寻找一种方法来解决这个问题。
关于iphone - 任何人都成功使用 UIView 的 NSProxy (例如 UILabel?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061223/
我有一个 UILabel,其不透明度已通过使用 [UIColor clearColor] 更改为空白我现在想将标签内文本的不透明度更改为尽可能完整的级别。我该怎么做? 最佳答案 使用以下代码更改UIL
我在同一个站点中阅读了如何插入和 UILabel(子类 UILabel 并覆盖所需的方法)。在将它添加到我的应用程序之前,我决定在一个独立的测试应用程序中对其进行测试。代码如下所示。 这是 MyUIL
NSString *longStr = @"AAAAAAAAAA\nBBBBB\nCCCCCCCCCCCCCCCCCC"; 如何使用 UILabel 截断某些标签宽度: AAA... BBB...
我想在 UILabel.text 上有一个纹理。 这样做我对 UILabel 进行了子类化。使用 -drawTextInRect 方法,我尝试仅获取用于使用 CGImageMaskCreate 函数创
我正在尝试使用 iOS 6.0 中新的自动布局 api 构建动态布局。我尝试构建的布局有 2 个按钮,它们之间有一个标签,如下图所示: 我想要的是以灰色显示的容器 View 根据标签中的文本量增加或减
我不知道这是否是我做错了什么,但每次 iOS 6 到 7、7 到 8 以及从 8 到 9 的重大更新时,一些 UILabel 似乎不够大,我看到“...”因为标签被截断了。我现在必须通过应用程序并重置
我偶然发现了一个我不确定如何解决的问题。 正如您在此处看到的名称应该所在的标签(我从用户输入中获取名称,这意味着它是动态的)。如果写得太长,它只会覆盖其他标签。 此外,在 Storyboard中,UI
我是初学者,所以对于任何似乎被忽视或简单的事情,我深表歉意。 基本上,我想要做的是让屏幕上的日期选择器更新 UILabel,然后获取更新 UILabel 的结果并将其推回到前一个屏幕上的另一个 UIL
我有一个 UILabel 的 NSMutableArray。我需要能够在用户触摸时选择此 NSMutableArray 中的特定 UILabel,并将此触摸 UILabel 的中心移动到用户将手指拖动
我知道对于类的元素 UIButton和 UIBarButtonItem他们自动假设window.tintColor作为主要颜色,如果我在应用程序中随时为窗口设置新的 tintColor,则会立即更改。
我是开发者世界的新人,自 2 月份以来一直断断续续地使用 swift 和 Xcode。我希望有人能帮助我。我正在尝试制作一个简单的小费计算器,但似乎无法将两个 uilabels 放在一起。这就是我到目
我有一个单元格原型(prototype),我正在尝试向其添加两个标签。我有两个紧挨着的标签,但标签的大小是动态的,所以我希望第二个标签能够根据第一个标签的大小移动。 基本上,我希望两个标签之间有一个固
这个问题看起来很平常..但是我昨天遇到了问题,我在 xib 中添加了一个标签并为其创建了导出,我想要在该标签内有多行,按钮,所以我决定添加新的子里面有标签... UILabel *label; lab
我正在尝试实现一个可以更改 uilabel 字体大小的功能,我可以缩放 uilabel 大小(即 uilabel.size),然后自动更改 uilabel 的字体大小,示例应用程序是 InstaTex
如果我设置bottomLabel.text = Chinese character,当我运行它时我看不到aboveLabel,如果我调试 View 层次我可以看到它。so有什么问题吗? UIL
我不太确定标题是否符合我的要求,但我有一个带有一堆句子的 label,我想将它们中的每一个分开到不同的 UILabel 这是我的代码 var s: [String] = [] for (i
当我更改 UILabel 的文本属性时,它只会在应用程序中部分更新。 我试过将它放在 viewDidLoad 函数和单独的专用函数中,但无济于事。如果我在更新后将 Label.text 打印到控制台,
我正在尝试使用自动布局对齐两个 UILabel,其中第一个标签没有设置宽度但使用固有内容大小,第二个应该与第一个宽度相同,将文本换行。 理想情况下,第二个标签应将数字行设置为 0 以使用动态类型,但我
我有几个标签,它们永远不应该相互接触。见下图(忽略黄色字母): 一共是4个标签,2个选手名字,2个分数。球员的名字将取代原来的球员标签文本。所以“玩家 1:”可以是任意宽度的任意文本。标签在 View
我正在开发一个应用程序,我需要能够点击并拖动 UILabels。第二个挑战是我需要屏幕上的其他 UILabel 相互移开(切勿重叠)。因此,当我拖动一个标签并遇到另一个标签时,它会将第二个标签撞开。也
我是一名优秀的程序员,十分优秀!