2

我有一个具有“登录”按钮的 loginviewcontroller 类。

登录类连接到我的 mainmenuviewcontroller 到 uiview。我连接如下

(mainmenuviewcontroller.h)

import <UIKit/UIKit.h> 
@interface ViewController : UIViewController

@property (strong) IBOutlet UIView *loginView;

@end

(mainmenuviewcontroller.m)

- (void)viewDidLoad
{
    [super viewDidLoad];

    LogInViewController *logIn = [[LogInViewController alloc] initWithNibName:@"LogInViewController" bundle:nil];
    [self.loginView addSubview:logIn.view];
    [self.loginView setClipsToBounds:YES];
}

在这一点上,一切都很好。我的 loginViewcontroller 在我的主菜单的自己的视图中显示 niceley。

当按下 loginviewcontroller 上的登录按钮(显示在主菜单的 uiview 中)时,它会调用位于其 loginviewcontroller 类中的以下方法。

(loginviewcontroller.h)

#import <UIKit/UIKit.h>

@interface LogInViewController : UIViewController
- (IBAction)loginButtonPressed;

@end

(loginviewcontroller.m)

- (IBAction)loginButtonPressed
{
    NSLog(@"login Button Pressed");
}

但是发生了一个异常,我不知道为什么:我已确保从按钮发送的动作内部的修饰具有正确的名称。我正在使用 Arc。帮助!:)

2013-10-28 13:57:46.367 Headache Mbl[1593:60b] -[NSConcreteMapTable loginButtonPressed]: unrecognized selector sent to instance 0x17d4fa20
2013-10-28 13:57:46.370 Headache Mbl[1593:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMapTable loginButtonPressed]: unrecognized selector sent to instance 0x17d4fa20'
*** First throw call stack:
(0x2de2fe8b 0x385826c7 0x2de337b7 0x2de320b7 0x2dd80e98 0x305ea55f 0x305ea4fb 0x305ea4cb 0x305d60f3 0x305e9f13 0x305e9bdd 0x305e4c09 0x305b9f59 0x305b8747 0x2ddfaf27 0x2ddfa3ef 0x2ddf8bdf 0x2dd63541 0x2dd63323 0x32a742eb 0x3061a1e5 0x60bdd 0x38a7bab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

我对此仍然很陌生,有人提出了一个可能的解决方案,即该类需要是一个属性。这是怎么做到的?谢谢

4

3 回答 3

3

如果您已正确连接 IBoutlet,

将其LogInViewController设为 ivar 或属性。该对象在 viewDidLoad 返回时失去其价值。

@interface ViewController : UIViewController
  {
    LogInViewController *logIn;
  }
    @property (strong) IBOutlet UIView *loginView;
@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    logIn = [[LogInViewController alloc] initWithNibName:@"LogInViewController" bundle:nil];
    [self.loginView addSubview:logIn.view];
    [self.loginView setClipsToBounds:YES];
}
于 2013-10-28T14:23:47.850 回答
0

当 viewDidLoad 结束时,logIn 对象将被释放,只有他的视图会存活,因为您将其添加到主视图控制器视图,因此当您点击按钮时,将向不再存在的对象发送消息。

让我说,您尝试做的事情在概念上是错误的,登录视图控制器应该添加到层次结构中,呈现它,推送它,或者包含在另一个视图控制器中,而不是仅仅为了获取他的视图并添加它而创建它到另一个视图控制器。

于 2013-10-28T14:28:24.350 回答
0
LogInViewController *logIn = [[LogInViewController alloc] initWithNibName:@"LogInViewController" bundle:nil];
[self addChildViewController:logIn];
[self.loginView addSubview:logIn.view];
[self.loginView setClipsToBounds:YES];

原来我需要将视图添加为子视图控制器。加载后,它会从内存中删除它,但仍会显示它。所以它需要作为一个孩子添加。

:)

于 2013-10-31T13:30:44.763 回答