Objective c 从带标记的UISlider获取值

Objective c 从带标记的UISlider获取值,objective-c,tags,slider,Objective C,Tags,Slider,导言 我已经创建了一系列带循环的滑块。现在我想在按下按钮时检索它们的值。似乎有一些问题导致应用程序崩溃,我不确定到底出了什么问题 代码 定义滑块标记 检索滑块值 日志 我猜这意味着没有找到滑块,但为什么会发生这种情况 2014-07-25 17:18:49.911 App1.0[5155:a0b]-[UIView值]:无法识别 选择器已发送到实例0x109a44f00 2014-07-25 17:18:49.913附件1.0[5155:a0b]*由于以下原因终止应用程序 未捕获异常“NSInva

导言

我已经创建了一系列带循环的滑块。现在我想在按下按钮时检索它们的值。似乎有一些问题导致应用程序崩溃,我不确定到底出了什么问题

代码

定义滑块标记

检索滑块值

日志

我猜这意味着没有找到滑块,但为什么会发生这种情况

2014-07-25 17:18:49.911 App1.0[5155:a0b]-[UIView值]:无法识别 选择器已发送到实例0x109a44f00

2014-07-25 17:18:49.913附件1.0[5155:a0b]*由于以下原因终止应用程序 未捕获异常“NSInvalidArgumentException”,原因:'-[UIView 值]:发送到实例0x109a44f00'的无法识别的选择器 *第一次抛出调用堆栈:0 CoreFoundation 0x0000000101ae8795 exceptionPreprocess+165 1 libobjc.A.dylib 0x000000010184b991 objc_异常_抛出+43 2 CoreFoundation 0x0000000101b79bad-[NSObjectNSObject未识别选择器:]+ 205 3芯基础0x0000000101ada09d ___转发+973 4 CoreFoundation 0x0000000101ad9c48转发+120 5 Dream1.0 0x0000000100001d8d-[TemplateViewController构建:][173 6 UIKit 0x00000001004af096-[UIApplication sendAction:to:from:forEvent:][80 7 UIKit 0x00000001004af044 -[UIApplication sendAction:toTarget:fromSender:forEvent:+17 8 UIKit 0x0000000100583450-[UIControl _发送操作提示:withEvent:+203 9 UIKit 0x00000001005829c0-[UIControl触摸发送:withEvent:+530 10 UIKit 0x00000001007b3c3d _UIGestureRecognitzerUpdate+5149 11 UIKit 0x00000001004e3925-[UIWindow\u sendGesturesForEvent:+928 12 UIKit 0x00000001004e45e5-[UIWindow sendEvent:+910 13 UIKit 0x00000001004bdfa2-[UIApplication sendEvent:+211 14 UIKit 0x00000001004abd7f\u UIApplicationHandleEventQueue+9549 15 CoreFoundation 0x0000000101a77ec1 CFRUNLOOP\u正在调用\u OUT\u到\u A\u SOURCE0\u PERFORM\u函数+17 16 CoreFoundation 0x0000000101a77792 __CFRunLoopDoSources0+242 17核心基础0x0000000101a9361f_uucfrunlooprun+767 18核心基础 0x0000000101a92f33 CFRunLoopRunSpecific+467 19图形服务 0x000000010311b3a0 GSEventRunModal+161 20 UIKit 0x00000001004ae043 UIApplicationMain+1010 21 Dream1.0 0x0000000100005903 main+115 22 libdyld.dylib 0x0000000103dc37e1 start+0 libc++abi.dylib:终止于 NSException lldb类型的未捕获异常

这是因为viewWithTag:不会每次都返回UISlider。 在第一个循环迭代中:

for (int i = 0; i < count; i++){
i等于0,0是默认值,因此视图控制器中未更改标记属性的每个UIView子类都将该值设置为0,例如您按下的按钮

解决方案之一是从1而不是0设置UISlider标记,检索滑块时应从1枚举,还应进行安全检查以确保您具有UISlider:

//计数的第一个值应为1,而不是0: //可以在init method中设置,也可以在循环计数=1之前设置

slider1.tag = count;
count += 1;  
[subView addSubview:slider1];

-(void) build:(id)sender {
    for (int i = 1; i <= count; i++){
        UIView *v = [self.view viewWithTag:i];
        if ([v isKindOfClass:[UISlider class]) {
            UISlider *Slider = (UISlider*)v;
            NSLog(@"%f",Slider.value);
        }
    }
}
for (int i = 0; i < count; i++){
slider1.tag = count;
count += 1;  
[subView addSubview:slider1];

-(void) build:(id)sender {
    for (int i = 1; i <= count; i++){
        UIView *v = [self.view viewWithTag:i];
        if ([v isKindOfClass:[UISlider class]) {
            UISlider *Slider = (UISlider*)v;
            NSLog(@"%f",Slider.value);
        }
    }
}