首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过标记获取UIButton

无法通过标记获取UIButton
EN

Stack Overflow用户
提问于 2013-02-10 17:12:20
回答 3查看 139关注 0票数 0

我有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种情况应该如何执行。

我哪里出问题了?

代码语言:javascript
复制
    -(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

代码语言:javascript
复制
- (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];
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-10 17:18:23

由于没有为此设置标记,因此默认将其赋值为0。如果您给它分配了标记,那么在代码中的某个地方,您要将标记0重新分配到它,检查它正在重新分配的位置。指定超过1000的标记,然后尝试。意思是给他们分配1000,1001,1002,1003,仅仅是为了检查。

将您的代码更改为

代码语言:javascript
复制
- (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

票数 2
EN

Stack Overflow用户

发布于 2013-02-10 17:19:05

当调用-(void)userTimePickerValueChanged:(UIButton *)sender时,发送方是日期选择器,而您将其错误地转换为UIButton*。该标记每次都是相同的值,日期选择器本身的标记可能是0。

不确定在该方法中要执行什么函数,但开关可能基于日期选择器的值,即所选日期。

票数 2
EN

Stack Overflow用户

发布于 2013-02-10 17:19:59

如果我正确地理解了您正在做的事情,时间选择器将调用userTimePickerValueChanged,因此在

代码语言:javascript
复制
-(void) userTimePickerValueChanged:(UIButton *)sender

发送者将是时间选择者,而不是您的任何按钮。这就解释了为什么它不起作用。

要解决这个问题,您需要在类中定义一个属性,其中存储的按钮实际上触发了要显示的日期选择器。那你就会做:

代码语言:javascript
复制
-(IBAction)notificationButtonChanged:(UIButton *)control
{
if (control.tag == 1)
{
   self.pressedButtonTag = control.tag;
   ...

以及:

代码语言:javascript
复制
-(void) userTimePickerValueChanged:(UIButton *)sender
{
   switch (self.pressedButtonTag)
  {

如果您感到“懒惰”,并且不希望创建一个特定的属性来跟踪按下的按钮,则可以动态地重新分配datePicker.tag

代码语言:javascript
复制
-(IBAction)notificationButtonChanged:(UIButton *)control {
  if (control.tag == 1) {
    userTimePicker.tag = control.tag;
    ...

以及:

代码语言:javascript
复制
-(void) userTimePickerValueChanged:(UIDatePicker *)sender {
   switch (sender.tag)
  {

请记住,第二个选项更像是一个黑客,所以我让您来决定您喜欢做什么,但是在第二个例子中添加注释来解释事情是如何工作的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14800294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档