UIButton 的点击事件无法响应

4

我制作了一个简单的应用程序,其中在每个方向上加载不同的.xib文件,

我有两个xib文件PortxibLandxib,在这两个xib文件中,我拖动了一个按钮并将标签值分配为1

我在viewDidLoad中编写了以下代码:

UIButton *btn=(UIButton *)[self.view viewWithTag:1];
    [btn addTarget:self action:@selector(BtnClick:) forControlEvents:UIControlEventTouchUpInside];

以下是选择器方法:

-(void)BtnClick:(id)sender
    {
        NSLog(@"BtnClick");
    }

UIButton的点击事件没有触发...

或者

有没有其他方法可以从两个方向调用按钮的相同方法?

编辑:

.h文件

.m文件


你可以尝试我的答案,从两个 XIB 中调用相同的方法。 - Vedchi
不,它没有被触发,我在xib中的文件所有者中没有使用(ctrl+拖动)创建任何插座或操作连接..因为我通过标记属性给按钮命名对象,我不确定但我认为我是正确的。 - Krunal
你的 changeOrientation 方法调用在 UIButton *btn=(UIButton *)[self.view viewWithTag:1]; 之前吗? - Bhavin_m
是的,changeOrientation 被调用了,但是点击事件没有被调用。我需要将 IBAction 事件连接到按钮吗? - Krunal
1
是的,您可以将 IBAction 事件连接到按钮上。这种方式是可行的... - Bhavin_m
显示剩余2条评论
3个回答

6

确保...

  1. 按钮应该放在xib的根视图中,因为你是在self.view中查找它,或者确保它放在正确的视图中,并使用该视图与viewWithTag一起使用。
  2. 你已经分配了标签1,所以请确保同一视图中没有其他控件具有标签1,否则该按钮将无法通过标签识别。如果这是你的情况,那么只需将按钮的标签更改为该视图中非常不寻常的数字,如999或任何其他数字,并进行测试。

编辑

我感觉你的视图在viewDidLoad中没有被识别出来,在那里你设置了你的代码。所以只需注释掉viewDidLoad中的代码,并将其移动到加载nib后的changeOrientation方法中。

-(void)changeOrientation
{
    UIInterfaceOrientation orientation =  [[UIApplication sharedApplication] statusBarOrientation];


    if(orientation==UIInterfaceOrientationPortrait || orientation==UIInterfaceOrientationPortraitUpsideDown)
    {
        [[NSBundle mainBundle] loadNibNamed:@"PortraitXib" owner:self options:nil];
    }
    else 
    {
        [[NSBundle mainBundle] loadNibNamed:@"LandscapeXib" owner:self options:nil];
    }

    //Adding this code here makes sense that nib is loaded and after that we are recognizing button from loaded view of nib.
    UIButton *btn = (UIButton*)[self.view viewWithTag:1];
    [btn addTarget:self action:@selector(BtnClick:) forControlEvents:UIControlEventTouchUpInside];    
}

希望这有所帮助。

我创建了一个没有xib的类,并添加了两个xib,一个用于纵向,另一个用于横向,在这两个xib中都有一个带有相同标签的按钮...但是点击事件仍然没有被触发... - Krunal
我认为xib视图不是self.view。 - Cintu
请查看我上传的项目链接:http://www.mediafire.com/?jtgwo4ydllizp0r - Krunal
检查我的帖子。打印那些。 - Cintu
1
请查看我的更新答案并尝试一下。我已经测试了你的代码,它之前没有工作,然后我将代码移到了changeOrientation中,现在它可以工作了 :) - βhargavḯ
显示剩余5条评论

5
在头文件中添加:

IBOutlet UIButton *btn;

从xib文件引用此btn。

在您的情况下,您正在使用的btn未从xib文件中引用,因此该方法未触发。

-(IBAction)BtnClick:(id)sender
{
    NSLog(@"BtnClick");
}

使函数成为IBAction,并从nib按钮引用此函数。在这种情况下,您无需显式添加目标。
如果您没有在nib中添加按钮,则不要忘记对视图进行初始化并添加子视图。
您可以查看此教程:http://www.idev101.com/learn/interface_builder_connections.html 编辑 检查打印内容是什么?
     for (UIButton *but in [self.view subviews])
     {
            NSLog("but.tag %d",but.tag);
            if(but.tag==1)// compare for same row elements
            {
            NSLog("Button Added");

              [btn addTarget:self action:@selector(BtnClick:) forControlEvents:UIControlEventTouchUpInside];
            }
      }

日志显示btn.tag为1,并显示“按钮已添加”,但点击事件仍未触发.. :( - Krunal

0

您可以像这样添加一个按钮。 将此代码添加到您的didLoad方法中

 UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [aButton setTag:1];
  [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
  [aView addSubview:aButton];
}

// then ...

- (void)buttonClicked:(UIButton*)button
{
  NSLog(@"Button %d clicked.", [button tag]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接