【问题标题】:Unrecognized selector sent to instance using Storyboards使用 Storyboard 将无法识别的选择器发送到实例
【发布时间】:2016-08-06 02:41:38
【问题描述】:

我正在为 iOS 应用程序使用故事板,我的故事板如下所示:http://d.pr/7yAY (droplr url)

问题是当我单击登录按钮时,我将捕获的用户名发送到事件表视图控制器。为此,我使用prepareForSegue 函数,但显然当我尝试在其中设置用户名时会引发异常。

我的代码如下:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

- (IBAction) logintButton:(id)sender;
@property (weak, nonatomic) IBOutlet UITextField *username_tf; // textfield

@end

ViewController.m

#import "ViewController.h"
#import "EventsTableViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize username_tf;


- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"ToMainApp"])
    {
        EventsTableViewController * dest = (EventsTableViewController *)[segue destinationViewController];
        NSString * username = [[NSString alloc] initWithFormat:@"%@", username_tf.text];
        [dest setUsername:username];
    }
}


- (IBAction) logintButton:(id)sender
{
    //NSLog(@"Logint button pressed");
    [self performSegueWithIdentifier:@"ToMainApp" sender:sender];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setUsername_tf:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

EventsTableViewController.h

#import <UIKit/UIKit.h>

@interface EventsTableViewController : UITableViewController
{
    NSString * username;
}

@property (nonatomic, retain) NSString * username;

@end

EventsTableViewController.m

#import "EventsTableViewController.h"

@interface EventsTableViewController ()
@end

@implementation EventsTableViewController

@synthesize username;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

...

@end

抛出的异常是:

2012-03-15 14:19:27.304 StoryboardAssistance[30989:f803]
-[UINavigationController setUsername:]: unrecognized selector sent to instance 0x68abf60 2012-03-15 14:19:27.306
StoryboardAssistance[30989:f803] *** Terminating app due to uncaught
exception 'NSInvalidArgumentException', reason:
'-[UINavigationController setUsername:]: unrecognized selector sent to
instance 0x68abf60'
*** First throw call stack: (0x13c9022 0x155acd6 0x13cacbd 0x132fed0 0x132fcb2 0x28e6 0x43e4be 0xdb5ab 0x2974 0x13cae99 0x1614e 0x160e6
0xbcade 0xbcfa7 0xbc266 0x3b3c0 0x3b5e6 0x21dc4 0x15634 0x12b3ef5
0x139d195 0x1301ff2 0x13008da 0x12ffd84 0x12ffc9b 0x12b27d8 0x12b288a
0x13626 0x253d 0x24a5) terminate called throwing an exception(lldb)

有什么建议吗?

【问题讨论】:

  • 你能做一步调试并找出它实际崩溃的那一行吗? NSString * username = [[NSString alloc] initWithFormat:@"%@", username_tf.text]; 也可以是 NSString * username = username_tf.text
  • 你能更新你的故事板的图像吗?目前是404ing。谢谢

标签: ios storyboard


【解决方案1】:

segue 的目标视图控制器是导航控制器,而不是事件表视图控制器。

您可以通过访问 Navigation 控制器的 topViewController 属性来获取 Events 控制器。

试试这个:

UINavigationController *navController = (UINavigationController*)[segue destinationViewController];
EventsTableViewController *eventsController = [navController topViewController];

NSString * username = [[NSString alloc] initWithFormat:@"%@", username_tf.text];
[eventsController setUsername:username];

【讨论】:

  • 这正是我想要的!
【解决方案2】:

或者,试试这个:-

(它与 jonkroll 的答案相同,但在一行中并删除了警告“Incompatible pointer types initializing 'ViewController *__strong' with an expression of type of UIViewController *

 NameOfViewController *vc = (NameOfViewController *)[[segue destinationViewController] topViewController];

【讨论】:

  • 伟大的单线解决方案。为我工作!
【解决方案3】:

要验证的另一件事是,您已将目标 ViewController 正确分配为 Interface Builder 中的正确类。默认情况下这将是UIViewControllerUITableViewController 等。如果您有一个带有getter/setter 的自定义类,您需要记住更改Interface Builder 中的类以相应地反映,否则您将收到无效选择器错误消息。

【讨论】:

  • 我觉得自己很笨,忘了做这个,谢谢提醒。
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多