我有一个loginviewcontroller类,它有一个按钮'login'。
登录类连接到我的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)
我仍然是一个新手,一个可能的解决方案被建议该类需要是一个属性。这是怎么做到的?感谢
答案 0 :(得分: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];
}
答案 1 :(得分:0)
当viewDidLoad结束时,logIn对象将被释放,只有他的视图才会存活,因为你将它添加到主视图控制器视图中,所以当你点击按钮时,会向不存在的对象发送一条消息了。
让我说,从概念上讲,你要做的事情是错误的,登录视图控制器应该被添加到层次结构中,呈现它,推送它,或者包含在另一个视图控制器中,但是不能创建它只是为了获得他的观点并将其添加到另一个viewcontroller。
答案 2 :(得分:0)
LogInViewController *logIn = [[LogInViewController alloc] initWithNibName:@"LogInViewController" bundle:nil];
[self addChildViewController:logIn];
[self.loginView addSubview:logIn.view];
[self.loginView setClipsToBounds:YES];
结果我需要将视图添加为子视图控制器。加载后,它会从内存中删除它,但仍会显示它。因此需要在孩提时加入。
:)