Iphone 在for循环中使用id而不是自定义类
我正在为iOS>5.0开发一个应用程序,并使用Xcode 4.6.2&我有一个Iphone 在for循环中使用id而不是自定义类,iphone,ios,ios5,ios6,uikit,Iphone,Ios,Ios5,Ios6,Uikit,我正在为iOS>5.0开发一个应用程序,并使用Xcode 4.6.2&我有一个UIView,其中包含一系列UIKit元素 举个例子,我有一个名为RadioButton的自定义类,它的基类是UIButton,正如您所想象的那样。我还有一个名为CRTLabel的类,它是UILabel的子类 当我在控制台中po[view subview]时,我得到了 $0 = 0x0754c4d0 <__NSArrayM 0x754c4d0>( <CRTLabel: 0x857f120; baseC
UIView
,其中包含一系列UIKit
元素
举个例子,我有一个名为RadioButton
的自定义类,它的基类是UIButton
,正如您所想象的那样。我还有一个名为CRTLabel
的类,它是UILabel
的子类
当我在控制台中po[view subview]
时,我得到了
$0 = 0x0754c4d0 <__NSArrayM 0x754c4d0>(
<CRTLabel: 0x857f120; baseClass = UILabel; frame = (10 10; 360 35); text = '2- Sizce evet mi hayır mı...'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 1; layer = <CALayer: 0x857f1b0>>,
<RadioButton: 0x857f520; baseClass = UIButton; frame = (20 65; 44 44); opaque = NO; layer = <CALayer: 0x857f5e0>>,
<CRTLabel: 0x857f800; baseClass = UILabel; frame = (84 65; 600 44); text = 'Evet'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 122; layer = <CALayer: 0x857f740>>,
<RadioButton: 0x857fb50; baseClass = UIButton; frame = (20 139; 44 44); opaque = NO; tag = 1; layer = <CALayer: 0x857fa60>>,
<CRTLabel: 0x857fd60; baseClass = UILabel; frame = (84 139; 600 44); text = 'Hayır'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 122; layer = <CALayer: 0x857fc60>>
)
我的应用程序崩溃,说没有选定的属性。我使用了isKindOfClass
方法来测试radioButton是否是radioButton
。因此,我发现它迭代了所有的子视图,如果它不是RadioButton
。为了进一步解释,即使当前子视图是CRTLabel
,它也会跳过下一行,CRTLabel
没有名为selected
的属性,因此它会崩溃
所以,我的期望是消除所有不是RadioButton
的类,它只在RadioButton
s上迭代
所以我的问题是,
在Objective-c的foreach循环中指定自定义类有什么好处?我总是可以在循环中使用id
,而不是检查id是否类似于RadioButton
测试是否属于类
for(id radioButton in view.subviews)
{
if(radioButton isKindOfClass: RADIOBUTTON)
{
if((RADIOBUTTON *)radioButton.selected == YES && (RADIOBUTTON *)radioButton.tag == 0)
// Does something
else if((RADIOBUTTON *)radioButton.selected == YES && (RADIOBUTTON *)radioButton.tag == 1)
// Does something
}
}
view.subview
将返回数组子视图。它将包括您的单选按钮和标签,如视图
的子视图
for(RadioButton *radioButton in view.subviews) // logically wrong since subView can be anything button,label...
for(UIView *subView in view.subviews)
{
// Iterate through all subViews
if([subView isKindOfClass:[RadioButton class]])
{
//safe no crash
}
}
您不能仅迭代特定视图(radioButton)。正如您所说,您可以遍历所有视图,并使用isKindOfClass
来标识特定的子视图。否则,您应该使用视图的标记属性来删除迭代我已经这样做了,它现在正在工作,我只是想知道使用自定义类而不是使用id的优点。哦,使用您所做的没有优点,而是缺点,不是很健壮不,但我需要通过RadioButton进行迭代,我不需要遍历所有UIViews,这是不可能的。您不能遍历特定的子视图。迭代所有子视图不会产生任何问题。。它的快速枚举。忽略它:)
for(RadioButton *radioButton in view.subviews) // logically wrong since subView can be anything button,label...
for(UIView *subView in view.subviews)
{
// Iterate through all subViews
if([subView isKindOfClass:[RadioButton class]])
{
//safe no crash
}
}