使用 XIB 加载的 UIView 按钮不起作用

Posted

技术标签:

【中文标题】使用 XIB 加载的 UIView 按钮不起作用【英文标题】:UIView Buttons loaded with XIB do not work 【发布时间】:2011-07-27 22:41:48 【问题描述】:

我已经使用单独的 XIB (SecondView.xib) 加载了 UIView (FirstView.m),但该 XIB 中的按钮使应用程序崩溃。按钮(IBOutlet 和 IBAction)的代码在 SecondView.m 中。

我需要将代码从 SecondView.m 指向 FirstView.m 吗?我尝试使用#import 和@class...但不成功。

我使用的代码是完全有效的...我很确定这个问题与将 XIB 加载到 UIView 中有关...然后可能失去与实现文件的连接。想法?

提前致谢!

FirstView.h

#import <UIKit/UIKit.h>
@interface FirstView : UIViewController 
    IBOutlet UIView *SecondViewPopUP;
    IBOutlet UIButton *openBTN;
    

@property (nonatomic, retain) UIView *SecondViewPopUP;
@property (nonatomic, retain) IBOutlet UIButton *openBTN;
-(IBAction)showPopUp:(id)sender;

FirstView.m

@synthesize SecondViewPopUP;
@synthesize openBTN

- (void)viewDidLoad 
    SecondViewPopUP.alpha = 0;

    // Add IncidentsViewController to view
    SecondView *SecondV=[[SecondView alloc] init];
    SecondV.view.frame = CGRectMake(0, 0, 262, 269);
    SecondV.view.clipsToBounds = YES;
    [SecondViewPopUP addSubview:SecondV.view];
    SecondViewPopUP.frame = CGRectMake(0, 76, 262, 269);
    [SecondV release];
    

-(IBAction)showPopUp:(id)sender 
    NSLog(@"Stats Button was pressed");

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.4];

    SecondViewPopUP.alpha = 1;

    [UIView commitAnimations];
    

SecondView.h

#import <UIKit/UIKit.h>

@interface ShareViewController : UIViewController 
    IBOutlet UIButton *share_facebook;
    IBOutlet UIButton *share_twitter;
    

@property (nonatomic, retain) IBOutlet UIButton *share_facebook;
@property (nonatomic, retain) IBOutlet UIButton *share_twitter;

-(IBAction)shareOnFB:(id)sender;
-(IBAction)shareOnTwitter:(id)sender;

SecondView.m

@synthesize share_twitter, share_facebook;
- (void)viewDidLoad 
    [super viewDidLoad];
    

-(IBAction)shareOnFB:(id)sender 
    NSLog(@"Shared on FB");
    

-(IBAction)shareOnTwitter:(id)sender 
    NSLog(@"Shared on Twitter");    
    

【问题讨论】:

已添加...大部分都是伪造的...我不想复制所有代码...但它很重要。 尝试 NSLogging 按钮的出口,确保它不是 nil [SecondViewPopUP SecondV.view] 行在做什么?方法名称不知何故不见了,对吧?如果您向我们提供更多详细信息(例如错误日志),将会很有帮助。 他们没有记录为 nil...这些按钮都连接在 Xcode 的 Interface Builder 部分中。 嘿大卫......这是一个错字......它应该有 addSubview 。都修好了。我会抓取一些错误日志。 【参考方案1】:

首先FirstView(大概是SecondView)是UIViewController而不是UIView,所以将其命名为“FirstViewController”会更清楚。视图和视图控制器是完全不同的东西。

其次,您将添加 UIViewController 的视图作为“[SecondViewPopUP addSubview:SecondV.view];”行上另一个视图的子视图这不是 UIViewController 的预期使用方式,UIViewController programming guide 有充分的理由建议不要这样做。

您创建的每个自定义视图控制器对象都负责管理单个视图层次结构中的所有视图。在 iPhone 应用程序中,视图层次结构中的视图传统上覆盖整个屏幕,但在 iPad 应用程序中,它们可能只覆盖屏幕的一部分。视图控制器与其视图层次结构中的视图之间的一一对应关系是关键的设计考虑因素。您不应使用多个自定义视图控制器来管理同一视图层次结构的不同部分。同样,您不应使用单个自定义视图控制器对象来管理多个屏幕的内容。

最后,如果您发布应用崩溃时列出的错误,我们可能会看到您正试图将 -shareOnFB:-shareOnTwitter: 消息发送到“FirstView”实例,但由于您的 nib 绑定​​,该实例未实现它们未正确配置,即您将 nib 的文件所有者设置为“SecondView”,然后将其加载为“FirstView”实例作为其所有者。如果没有更多数据,无法确定。

【讨论】:

感谢 Jonah ...您对视图控制器的看法是正确的。这是我的问题:你会建议我如何保持良好的使用状态?一旦点击按钮,我希望出现一个弹出窗口(不覆盖整个屏幕)。填充它的最佳方法是什么? 此外,崩溃后,我的控制台显示“sharedlibrary apply-load-rules all Current language: auto; current objective-c (gdb)”...它也因“线程 1:程序”而崩溃接收到的信号:'EXC_BAD_ACCESS'。" 您可以拥有一个没有自己的 UIViewController 实例来管理它的视图。只需创建一个视图(如果方便,可以使用 UINib 从 nib 加载它)并将其添加为子视图。如果您有特定于该视图的控制器级逻辑,请为其创建一个控制器类,但该控制器可以从 NSObject 继承,而不是从 UIViewController 继承。请参阅 UIViewController 编程指南的链接部分中的“注意:”。 谢谢乔纳!感谢您的帮助。 最后一个问题:如果我使用 NIB 加载视图,该 NIB 是否仍会连接到视图控制器?还是会独立存在?

以上是关于使用 XIB 加载的 UIView 按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

添加子视图不起作用?

更改自定义 UIView 的 UILabel 文本不起作用

按钮在 XIB 文件中不起作用

创建自定义 xib 类的实例使手势识别器不起作用

Swift UIView 小部件自动布局不起作用

UIView clipsToBounds不起作用