我有4个UIButtons,名为morningbutton,下午按钮,晚间按钮,其中有标记号1、2、3、4 ..and --它在viewDidLoad中分配。我在viewDidLoad中调用了viewDidLoad方法,并且正在调用它作为数据报警器,而通知按钮更改方法由UIButtons调用。
selectedButton是一个NSInteger
用户点击4个标记按钮中的1个(调用notificationButtonChanged)
用户更改日期选择器的值(userTimePickerValueChanged被调用)
当我点击一个基于标记的按钮时,notificationButtonChanged会被调用,并且当我在数据报警器中选择一个时间时,..but selectedButton将返回0,该时间应该存储在用户时间选择器更改的方法中。
如果我将selectedButton = afternoonButton.tag ..then放在第二种情况下执行,那么这4种情况应该如何执行。
我哪里出问题了?
-(IBAction)notificationButtonChanged:(UIButton *)control
{
if (control.tag == 1)
{
[userTimePicker reloadInputViews];
[components setHour:6];;
[components setMinute:00];
NSDate *date1 = [gregorian dateFromComponents:components];
[components setHour:10];
[components setMinute:00];
NSDate *date2 = [gregorian dateFromComponents:components];
[userTimePicker setDatePickerMode:UIDatePickerModeTime];
[userTimePicker setMinimumDate:date1];
[userTimePicker setMaximumDate:date2];
}
if (control.tag == 2)
{
[userTimePicker reloadInputViews];
[components setHour:12];
[components setMinute:00];
NSDate *date1 = [gregorian dateFromComponents:components];
[components setHour:14];
[components setMinute:00];
NSDate *date2 = [gregorian dateFromComponents:components];
[userTimePicker setDatePickerMode:UIDatePickerModeTime];
[userTimePicker setMinimumDate:date1];
[userTimePicker setMaximumDate:date2];
}
if (control.tag == 3)
{
[userTimePicker reloadInputViews];
[components setHour:15];
[components setMinute:00];
NSDate *date1 = [gregorian dateFromComponents:components];
[components setHour:18];
[components setMinute:00];
NSDate *date2 = [gregorian dateFromComponents:components];
[userTimePicker setDatePickerMode:UIDatePickerModeTime];
[userTimePicker setMinimumDate:date1];
[userTimePicker setMaximumDate:date2];
}
if (control.tag == 4)
{
[userTimePicker reloadInputViews];
[components setHour:19];
[components setMinute:00];
NSDate *date1 = [gregorian dateFromComponents:components];
[components setHour:22];
[components setMinute:00];
NSDate *date2 = [gregorian dateFromComponents:components];
[userTimePicker setDatePickerMode:UIDatePickerModeTime];
[userTimePicker setMinimumDate:date1];
[userTimePicker setMaximumDate:date2];
}
}
-(void) userTimePickerValueChanged:(UIButton *)sender
{
selectedButton = [sender tag];
switch (selectedButton)
{
case 1:
{
NSUserDefaults *userSelectedMorningTime = [NSUserDefaults standardUserDefaults];
NSDate *selectedMorningTime = [userTimePicker date];
NSLog (@"SETTING: morningTimeKey");
[userSelectedMorningTime setObject:selectedMorningTime forKey:@"morningTimeKey"];
[userSelectedMorningTime synchronize];
}
break;
case 2:
{
NSUserDefaults *userSelectedAfternoonTime = [NSUserDefaults standardUserDefaults];
NSDate *selectedAfternoonTime = [userTimePicker date];
NSLog (@"SETTING: afternoonTimeKey");
[userSelectedAfternoonTime setObject:selectedAfternoonTime forKey:@"afternoonTimeKey"];
[userSelectedAfternoonTime synchronize];
}break;
case 3:
{
NSUserDefaults *userSelectedEveningTime = [NSUserDefaults standardUserDefaults];
NSDate *selectedEveningTime =[userTimePicker date];
NSLog (@"SETTING: eveningTimeKey");
[userSelectedEveningTime setObject:selectedEveningTime forKey:@"eveningTimeKey"];
[userSelectedEveningTime synchronize];
}break;
case 4:
{
NSUserDefaults *userSelectedNightTime = [NSUserDefaults standardUserDefaults];
NSDate *selectedNightTime =[userTimePicker date];
NSLog (@"SETTING: nightTimeKey");
[userSelectedNightTime setObject:selectedNightTime forKey:@"nightTimeKey"];
[userSelectedNightTime synchronize];
}
break;
default:
break;
}
}viewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
userTimePicker = [[UIDatePicker alloc]init];
[userTimePicker addTarget: self
action: @selector(userTimePickerValueChanged:)forControlEvents: UIControlEventValueChanged];
morningButton = [[UIButton alloc]init];
morningButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
afternoonButton = [[UIButton alloc]init];
afternoonButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
eveningButton = [[UIButton alloc]init];
eveningButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
nightButton =[[UIButton alloc]init];
nightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
}
-(IBAction)settingsButtonChanged:(UIButton *)sender
{
settingsView.frame = CGRectMake(25.0, 60.0, 280.0, 400.0);
morningButton.tag = 1;
morningButton.frame = CGRectMake(25.0, 20.0, 80.0, 40.0);
morningButton.backgroundColor = [UIColor brownColor];
[morningButton setTitle:@"Morning" forState:UIControlStateNormal];
afternoonButton.tag =2;
afternoonButton.frame = CGRectMake(185.0, 20.0, 80.0, 40.0);
afternoonButton.backgroundColor = [UIColor grayColor];
[afternoonButton setTitle:@"Afternoon" forState:UIControlStateNormal];
eveningButton.tag = 3;
eveningButton.frame = CGRectMake(25.0, 70.0, 80.0, 40.0);
eveningButton.backgroundColor = [UIColor greenColor];
[eveningButton setTitle:@"Evening" forState:UIControlStateNormal];
nightButton.tag = 4;
nightButton.frame = CGRectMake(185.0, 70.0, 80.0, 40.0);
nightButton.backgroundColor = [UIColor orangeColor];
[nightButton setTitle:@"Night" forState:UIControlStateNormal];
userTimePicker.frame = CGRectMake(60.0, 194.0, 150.0, 180.0);
userTimePicker.datePickerMode = UIDatePickerModeTime;
[morningButton addTarget:self action:@selector(notificationButtonChanged:) forControlEvents:UIControlEventTouchUpInside];
[afternoonButton addTarget:self action:@selector(notificationButtonChanged:) forControlEvents:UIControlEventTouchUpInside];
[eveningButton addTarget:self action:@selector(notificationButtonChanged:) forControlEvents:UIControlEventTouchUpInside];
[nightButton addTarget:self action:@selector(notificationButtonChanged:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:remedyViewBackButton];
[settingsView addSubview:morningButton];
[settingsView addSubview:afternoonButton];
[settingsView addSubview:eveningButton];
[settingsView addSubview:nightButton];
[settingsView addSubview:userTimePicker];
[remedyView addSubview:remedyViewBackButton];
[remedyView addSubview:settingsView];
}发布于 2013-02-10 17:18:23
由于没有为此设置标记,因此默认将其赋值为0。如果您给它分配了标记,那么在代码中的某个地方,您要将标记0重新分配到它,检查它正在重新分配的位置。指定超过1000的标记,然后尝试。意思是给他们分配1000,1001,1002,1003,仅仅是为了检查。
将您的代码更改为
- (void)viewDidLoad
{
[super viewDidLoad];
userTimePicker = [[UIDatePicker alloc]init];
[userTimePicker addTarget: self
action: @selector(userTimePickerValueChanged:)forControlEvents: UIControlEventValueChanged];
morningButton = [[UIButton alloc]init];
morningButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
morningButton.tag=1;
afternoonButton = [[UIButton alloc]init];
afternoonButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
afternoonButton.tag=2;
eveningButton = [[UIButton alloc]init];
eveningButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
eveningButton.tag=3;
nightButton =[[UIButton alloc]init];
nightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
nightButton.tag=4;
}也可以在所有的按钮上使用initWithFrame
发布于 2013-02-10 17:19:05
当调用-(void)userTimePickerValueChanged:(UIButton *)sender时,发送方是日期选择器,而您将其错误地转换为UIButton*。该标记每次都是相同的值,日期选择器本身的标记可能是0。
不确定在该方法中要执行什么函数,但开关可能基于日期选择器的值,即所选日期。
发布于 2013-02-10 17:19:59
如果我正确地理解了您正在做的事情,时间选择器将调用userTimePickerValueChanged,因此在
-(void) userTimePickerValueChanged:(UIButton *)sender发送者将是时间选择者,而不是您的任何按钮。这就解释了为什么它不起作用。
要解决这个问题,您需要在类中定义一个属性,其中存储的按钮实际上触发了要显示的日期选择器。那你就会做:
-(IBAction)notificationButtonChanged:(UIButton *)control
{
if (control.tag == 1)
{
self.pressedButtonTag = control.tag;
...以及:
-(void) userTimePickerValueChanged:(UIButton *)sender
{
switch (self.pressedButtonTag)
{如果您感到“懒惰”,并且不希望创建一个特定的属性来跟踪按下的按钮,则可以动态地重新分配datePicker.tag。
-(IBAction)notificationButtonChanged:(UIButton *)control {
if (control.tag == 1) {
userTimePicker.tag = control.tag;
...以及:
-(void) userTimePickerValueChanged:(UIDatePicker *)sender {
switch (sender.tag)
{请记住,第二个选项更像是一个黑客,所以我让您来决定您喜欢做什么,但是在第二个例子中添加注释来解释事情是如何工作的。
https://stackoverflow.com/questions/14800294
复制相似问题