【问题标题】:UIView (subview) does not send IBActions to AppDelegateUIView(子视图)不向 AppDelegate 发送 IBActions
【发布时间】:2010-06-30 03:26:51
【问题描述】:

我遇到这个问题是因为我最初在主 NIB 中制作了所有内容,但在阅读后了解到最好使用子视图。

我在 AppDelegate 中有我的 IBAction,并且我已经成功连接并加载了我的子视图。但是,当我尝试将子视图中的按钮连接到 AppDelegate 中的 IBAction 时,IBAction 会出现在“First Responder”下。它们似乎连接得很好,但是在运行应用程序时它们不会触发 IBActions(我已经用一些 NSLogs 确认了这一点,这不是 IBActions 中的代码错误)。我做错了什么?

谢谢!

【问题讨论】:

    标签: iphone cocoa-touch uiview uiapplicationdelegate ibaction


    【解决方案1】:

    AppDelegate 只能用于非常具体的项目,例如实现UIApplicationDelegate 协议(即applicationDidFinishLaunching 等方法)或在某些情况下存储全局变量。

    您应该将 IBActions 和其他 outlets 保存在它们各自的视图控制器文件中(即,如果您创建了与 MyViewController.xib 链接的 MyViewController.h 和 MyViewController.m,其中有一些按钮、图像等)。然后可以通过将所需的检查器控件(即 TouchUpInside)拖动到文件所有者来连接它们。

    您应该阅读以更好地理解视图控制器的内容:http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

    通常最好为您将呈现给用户的每个视图创建一个唯一的视图控制器。例如,如果我有一个主屏幕,然后是一个“关于”或设置屏幕,我会让每个屏幕成为他们自己的视图控制器。与使用一个视图和一大堆隐藏/显示的子视图相比,它有助于更​​好地组织事物,并且还可以改善加载时间和总体性能。

    更新您在 cmets 中关于访问应用委托的第二个问题:

    首先,您需要将应用程序委托的 .h 文件(即#import "AppDelegate.h")导入您想要用于访问您存储在应用程序委托文件中的任何变量、数组等的任何视图控制器 .m 文件中。确保在应用代理的 .m 文件中合成您在应用代理的 .h 文件中创建的任何对象,以便创建 getter 和 setter(以便您可以访问它们)。

    然后在视图控制器 .m 文件中,无论您使用哪种方法:

    -(void)someMethod { 
     // here we just create a shortcut to the app delegate called "theAppDelegate"
     YourAppDelegateFileNameHere *theAppDelegate = (YourAppDelegateFileNameHere *)[[UIApplication sharedApplication] delegate];
    
     // now you can use the dot notation if you wanna access a variable
     int SomeNewInteger = theAppDelegate.someIntegerYouHaveStored;
    
     // or some array you have stored
     return [theAppDelegate.someArrayYouCreated count]; 
     }
    

    希望有帮助!

    【讨论】:

    • 谢谢!从视图控制器中的 AppDelegate 访问对象怎么样?我已经像这样声明了 AppDelegate: //Interface AppDelegate appDelegate; @property (nonatomic, 保留) AppDelegate *appDelegate; //实现@synthesize appDelegate; appDelegate = (AppDelegate)[[UIApplication sharedApplication] delegate];然而,当我尝试做某事时,我总是得到“访问未知的 getter 方法”。抱歉,stackOverflow 不允许我很好地格式化我的评论。
    • 请查看我的更新回复,了解如何正确调用它。与应用程序委托有点不同,因为您不需要像以前那样设置属性或合成它(这就是您收到未知 getter 方法错误的原因)
    • P.S.如果答案对您有用,请养成为最有用的答案点赞的习惯。这有点像在附近拍拍人们的后背以寻求帮助:)
    • 好的,我发现我需要使用箭头语法(我试图做 [theAppDelegate.networkClient sendMessage:@"whatever"]; 实际上我需要 [theAppDelegate->networkClient sendMessage: @“任何”]; )。但是现在我在编译时没有收到任何错误,但应用程序只是崩溃了......直到现在我才能投票。需要这么多的声誉或类似的东西。 :) 感谢您的帮助。
    • 您可能应该开始一个新问题,因为这与您原来的问题有点偏离主题。在你的新问题中,你能解释一下networkClient 是什么吗?它只是您尝试调用并将变量传递给的方法还是您尝试访问实例变量?此外,在控制台崩溃后(在 XCode 的“运行”菜单下)会显示什么错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多